2009-03-03 34 views
15

Ich versuche, ein Silverlight DataGrid an die Ergebnisse eines WCF-Serviceanrufs zu binden. Ich habe die Daten nicht im Raster angezeigt. Wenn ich den Debugger durchläuft, bemerke ich, dass XDocument.Descendants() keine Elemente zurückgibt, selbst wenn ich einen gültigen Elementnamen übergeben habe. Hier ist die XML, die wieder aus dem Dienst übergeben wird:XDocument.Descendants() gibt keine Elemente zurück

<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> 

Und hier ist die Methode, die ich verwende, um die Ergebnisse in eine Sammlung von anonymen Objekten zu laden, mit Linq to XML und dann binden die Sammlung an das Netz .

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; 
} 

Jede Idee, warum xml.Descendants("Employee") gibt nichts zurück?

Danke!

Antwort

33

Der an Descendents übergebene String-Parameter wird implizit in ein XName-Objekt konvertiert. Ein XName repräsentiert einen vollständig qualifizierten Elementnamen.

Das Dokument definiert einen Namensraum "i", daher glaube ich, dass Sie den vollständig qualifizierten Namen verwenden müssen, um auf Employee zuzugreifen. dh. i: Mitarbeiter, wo das Präfix „i. tatsächlich an den vollständigen Namespace String löst

Haben Sie versucht, so etwas wie:

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

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

... 
+1

Sie hatten Recht, ich musste den Namespace mit einbeziehen Danke für die Hilfe! –

0

Sie sind nicht den Namespace aus dem übergeordneten Element einschließlich:

XNameSpace ns = "http://schemas.datacontract.org/2004/07/Employees.Entities"; 
foreach (XElement element in xdoc.Descendants(ns + "Employee") 
{ 
    ... 
} 
Verwandte Themen