Domanda

Sto cercando di associare un Silverlight DataGrid ai risultati di una chiamata di servizio WCF. Non stavo vedendo i dati visualizzati nella griglia, quindi quando ho eseguito il debugger, ho notato che XDocument.Descendants () non restituiva alcun elemento anche quando passavo con un nome di elemento valido. Ecco l'XML che viene restituito dal servizio:

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

Ed ecco il metodo che uso per caricare i risultati in una raccolta di oggetti anonimi, usando Linq a XMl, e quindi associare la raccolta alla griglia.

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

Qualche idea sul perché xml.Descendants (" Employee ") non restituisce nulla?

Grazie!

È stato utile?

Soluzione

Il parametro stringa passato a Descendents viene effettivamente convertito implicitamente in un oggetto XName. Un XName rappresenta un nome di elemento completo.

Il documento definisce uno spazio dei nomi "i", pertanto credo che sia necessario utilizzare il nome completo per accedere al Dipendente. vale a dire. i: Employee, dove il prefisso & i; i: in realtà si risolve nella stringa dello spazio dei nomi completa.

Hai provato qualcosa del tipo:

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

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

...

Altri suggerimenti

Non stai includendo lo spazio dei nomi dall'elemento genitore:

XNameSpace ns = "http://schemas.datacontract.org/2004/07/Employees.Entities";
foreach (XElement element in xdoc.Descendants(ns + "Employee")
{
    ...
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top