Question

J'essaie de lier un Silverlight DataGrid aux résultats d'un appel de service WCF. Je ne voyais pas les données affichées dans la grille. Ainsi, lorsque j'ai parcouru le débogueur, j'ai remarqué que XDocument.Descendants () ne renvoyait aucun élément, même lorsque je passais à un nom d'élément valide. Voici le code XML renvoyé par le service:

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

Et voici la méthode que j'utilise pour charger les résultats dans une collection d'objets anonymes, en utilisant Linq vers XMl, puis en liant la collection à la grille.

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

Vous savez pourquoi xml.Descendants ("Employé") ne renvoie rien?

Merci!

Était-ce utile?

La solution

Le paramètre de chaîne transmis à Descendents est en fait converti implicitement en un objet XName. Un XName représente un nom d'élément complet.

Le document définit un espace de noms "i". Je pense donc que vous devez utiliser le nom complet pour accéder à Employee. c'est à dire. i: Employé, où le préfixe " i: se résout en fait en une chaîne d'espace de nom complet.

Avez-vous essayé quelque chose comme:

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

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

...

Autres conseils

Vous n'incluez pas l'espace de noms de l'élément parent:

XNameSpace ns = "http://schemas.datacontract.org/2004/07/Employees.Entities";
foreach (XElement element in xdoc.Descendants(ns + "Employee")
{
    ...
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top