Frage

Ich versuche, eine Silverlight-Datagrid zu den Ergebnissen eines WCF-Service-Aufruf zu binden. Ich war nicht zu sehen, die im Raster angezeigten Daten, so dass, wenn ich durch den Debugger lief, merke ich, dass XDocument.Descendants () wurde keine Elemente selbst zurückkehrt, wenn I wurde in einem gültigen Elementnamen übergeben. Hier ist die XML, die wieder aus dem Dienst übergeben wird:

<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 die Ergebnisse in eine Sammlung von anonymen Objekten laden verwenden, mit LINQ to XML und dann die Sammlung an das Gitter zu binden.

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") nichts zurückliefert?

Danke!

War es hilfreich?

Lösung

Die String-Parameter auf Descendents geben wird tatsächlich implizit auf ein XName Objekt umgewandelt. Ein XName stellt einen vollqualifizierten Elementnamen.

Das Dokument definiert einen Namensraum „i“, deshalb glaube ich, Sie die vollständig qualifizierten Namen für den Zugriff Mitarbeiter verwenden müssen. dh. i: Mitarbeiter, wo das Präfix „i: tatsächlich an dem 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)

...

Andere Tipps

Sie sind nicht inklusive den Namensraum aus dem übergeordneten Elemente:

XNameSpace ns = "http://schemas.datacontract.org/2004/07/Employees.Entities";
foreach (XElement element in xdoc.Descendants(ns + "Employee")
{
    ...
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top