2009-03-03 4 views
15

Silverlight DataGrid를 WCF 서비스 호출 결과에 바인딩하려고합니다. 그리드에 표시되는 데이터를 보지 못했습니다. 따라서 디버거를 살펴 보았을 때 유효한 요소 이름을 전달할 때 XDocument.Descendants()가 요소를 반환하지 않음을 알았습니다. 여기XDocument.Descendants()에서 요소를 반환하지 않습니다.

<ArrayOfEmployee xmlns="http://schemas.datacontract.org/2004/07/Employees.Entities" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <Employee> 
    <BirthDate>1953-09-02T00:00:00</BirthDate> 
    <EmployeeNumber>10001</EmployeeNumber> 
    <FirstName>Georgi</FirstName> 
    <Gender>M</Gender> 
    <HireDate>1986-06-26T00:00:00</HireDate> 
    <LastName>Facello</LastName> 
    </Employee> 
    <Employee> 
    <BirthDate>1964-06-02T00:00:00</BirthDate> 
    <EmployeeNumber>10002</EmployeeNumber> 
    <FirstName>Bezalel</FirstName> 
    <Gender>F</Gender> 
    <HireDate>1985-11-21T00:00:00</HireDate> 
    <LastName>Simmel</LastName> 
    </Employee> 
</ArrayOfEmployee> 

을 내가 LINQ to XML의를 사용하여, 익명 개체의 컬렉션에 결과를로드 한 후 그리드에 컬렉션을 결합하는 데 사용하는 방법 다음은 서비스에서 다시 전달되는 XML이다 .

void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs args) 
{ 
    if (args.Error != null) return; 
    var xml = XDocument.Parse(args.Result); 
    var employees = from e in xml.Descendants("Employee") 
        select new 
        { 
         EmployeeNumber = e.Element("EmployeeNumber").Value, 
         FirstName = e.Element("FirstName").Value, 
         LastName = e.Element("LastName").Value, 
         Birthday = e.Element("BirthDate").Value 
        }; 
    DataGrid.SelectedIndex = -1; 
    DataGrid.ItemsSource = employees; 
} 

아무런 이유가 없다면 어떤 이유로든 xml.Descendants("Employee")이 표시되지 않습니다.

감사합니다.

답변

33

Descendents에 전달 된 문자열 매개 변수는 실제로 암시 적으로 XName 개체로 변환됩니다. XName은 완전한 요소 이름을 나타냅니다.

이 문서는 네임 스페이스 "i"를 정의하므로 정규화 된 이름을 사용하여 Employee에 액세스해야한다고 생각합니다. 즉. I : 접두사가 "내가 직원 :.

XName qualifiedName = XName.Get("Employee", "http://www.w3.org/2001/XMLSchema-instance"); 

var employees = from e in xml.Descendants(qualifiedName) 

... 
+1

네 말이 맞아, 네임 스페이스를 포함시켜야 해. 도와 줘서 고마워! –

0

당신은 부모 요소의 네임 스페이스에 포함되지 않습니다 :

XNameSpace ns = "http://schemas.datacontract.org/2004/07/Employees.Entities"; 
foreach (XElement element in xdoc.Descendants(ns + "Employee") 
{ 
    ... 
} 
를 실제로 풀 네임 스페이스 문자열로 해석

당신이 뭔가를 시도 되세요
관련 문제