2009-03-03 16 views
15

Estoy intentando vincular un DataGrid de Silverlight a los resultados de una llamada de servicio WCF. No veía los datos mostrados en la cuadrícula, así que cuando revisé el depurador, noté que XDocument.Descendants() no devolvía ningún elemento, incluso cuando estaba ingresando un nombre de elemento válido. Aquí está el código XML que se devuelve desde el servicio:XDocument.Descendants() no devuelve ningún elemento

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

Y aquí está el método que utilizo para cargar los resultados en una colección de objetos anónimos, utilizando LINQ to XML, y luego obligar a la colección a la red .

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

Cualquier idea de por qué xml.Descendants("Employee") no devuelve nada?

Gracias!

Respuesta

33

El parámetro de cadena que se pasa a Descendents se convierte implícitamente en un objeto XName. Un XName representa un nombre de elemento completamente calificado.

El documento define un espacio de nombres "i", por lo tanto, creo que debe utilizar el nombre completo para acceder a Employee. es decir. i: Empleado, donde el prefijo "i:. En realidad se resuelve a la cadena de espacio de nombres completo

Ha intentado algo así como:

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

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

... 
+1

Tenías razón, necesitaba incluir el espacio de nombres. ¡Gracias por la ayuda! –

0

No está incluyendo el espacio de nombres del elemento padre:

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