2009-03-03 2 views
15

Я пытаюсь связать Silverlight DataGrid с результатами вызова службы WCF. Я не видел данные, отображаемые в сетке, поэтому, когда я проходил через отладчик, я заметил, что XDocument.Descendants() не возвращал никаких элементов, даже когда я передавал действительное имя элемента. Вот XML, который передается обратно от службы: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 для 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

Параметр string, переданный Descendents, фактически неявно преобразован в объект XName. XName представляет собой полное имя элемента.

Документ определяет пространство имен «i», поэтому я считаю, что вам нужно использовать полное имя для доступа к Employee. то есть. я: Сотрудник, где приставка «я:. фактически решает строки полного пространства имен

Вы пробовали что-то вроде:

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") 
{ 
    ... 
} 
Смежные вопросы