Pregunta

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

<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, usando Linq a XMl, y luego vincular la colección a la cuadrícula.

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

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

¡Gracias!

¿Fue útil?

Solución

El parámetro de cadena pasado a Descendents en realidad 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 necesita usar el nombre completo para acceder a Employee. es decir. i: Empleado, donde el prefijo " i: en realidad se resuelve en la cadena de espacio de nombres completa.

¿Has probado algo como:

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

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

...

Otros consejos

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")
{
    ...
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top