2009-03-03 3 views
15

Sto tentando di associare un DataGrid Silverlight ai risultati di una chiamata di servizio WCF. Non vedevo i dati visualizzati nella griglia, quindi quando ho eseguito il debugger, ho notato che XDocument.Descendants() non restituiva alcun elemento anche quando stavo passando un nome di elemento valido. Ecco l'XML che viene passato indietro dal servizio:XDocument.Descendants() non restituisce alcun 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> 

E qui è il metodo che uso per caricare i risultati in una collezione di oggetti anonimi, utilizzando LINQ to XML, e quindi associare la collezione 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; 
} 

Qualsiasi idea del perché xml.Descendants("Employee") non restituisce nulla?

Grazie!

risposta

33

Il parametro stringa passato a Descendents è in realtà implicitamente convertito in un oggetto XName. Un XName rappresenta un nome di elemento completo.

Il documento definisce uno spazio dei nomi "i", quindi credo che sia necessario utilizzare il nome completo per accedere a Employee. vale a dire. i: Dipendente, dove il prefisso "i:. risolve in realtà per la stringa completa namespace

Hai provato qualcosa di simile:

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

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

... 
+1

Avevi ragione, dovevo includere lo spazio dei nomi. Grazie per l'aiuto! –

0

Lei non stanno 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") 
{ 
    ... 
}