4 votes

Retourner tous les éléments XML avec le même nom en Linq

Comment puis-je interroger un fichier XML où j'ai plusieurs éléments avec le même nom, afin que je puisse obtenir tous les éléments en retour. Actuellement, je ne reçois que le premier résultat en retour. J'ai réussi à le faire fonctionner avec le code suivant, mais cela renvoie tous les éléments où les critères de recherche spécifiques sont remplis. Ce que je veux en sortie, c'est obtenir deux résultats où l'emplacement est Dublin par exemple. La question est comment puis-je y parvenir avec Linq to XML

Salut Chris,

Voici le code

string location = "Oslo";    
var training = (from item in doc.Descendants("item")
                         where item.Value.Contains(location)

                      select  new
                         {
                             event = item.Element("event").Value,
                             event_location = item.Element("location").Value
                         }).ToList();

Le fichier XML ressemble à ceci

      Formation C#
        Prague
        Oslo
        Amsterdam
        Athens
        Dublin
        Helsinki

        Formation LINQ
        Bucharest
        Oslo
        Amsterdam
        Helsinki
        Brussels
        Dublin

5voto

Jon Skeet Points 692016

Vous utilisez item.Element("location") qui renvoie le premier élément de localisation sous l'élément. Ce n'est pas nécessairement l'emplacement que vous cherchez!

Je soupçonne que vous voulez en fait quelque chose de plus proche de :

chaîne de localisation = "Oslo";
var formation = from loc in doc.Descendants("location")
               where loc.Value == localisation
               select new
               {
                   événement = loc.Parent.Element("event").Value,
                   lieu_de_lévénement = loc.Value
               };

Mais, dans ce cas, quelle valeur lieu_de_lévénement fournit-il, étant donné qu'il sera toujours l'emplacement que vous avez passé dans la requête?

Si ce n'est pas ce que vous voulez, veuillez donner plus de détails - votre question est légèrement difficile à comprendre pour le moment. Les détails de ce que votre code actuel fournit et ce que vous voulez qu'il donne seraient utiles - ainsi que ce que vous entendez par "nom" (en ce sens que vous voulez probablement dire "valeur").

ÉDITER: D'accord, il semble que vous vouliez :

chaîne de localisation = "Oslo";
var formation = from loc in doc.Descendants("location")
               where loc.Value == localisation
               select new
               {
                   événement = loc.Parent.Element("event").Value,
                   lieux_de_lévénement = loc.Parent.Elements("location")
                                               .Select(e => e.Value)
               };

lieux_de_lévénement sera maintenant une séquence de chaînes. Vous pouvez obtenir la sortie souhaitée avec :

pour (var entrée in formation)
{
     Console.WriteLine("Événement: {0}; Lieux: {1}",
                       entrée.événement,
                       string.Join(", ", entrée.lieux_de_lévénement.ToArray());
}

Essayez cela et voyez si c'est ce que vous voulez...

0voto

Andy Points 15910

Ce n'est peut-être pas la manière la plus efficace de le faire, mais cette requête fonctionne :

var training = (from item in root.Descendants("item")
                where item.Value.Contains(location)
                select new
                {
                    name = item.Element("event").Value,
                    location = (from node in item.Descendants("location")
                               where node.Value.Equals(location)
                               select node.Value).FirstOrDefault(),
                }).ToList();

(Notez que le code ne compilerait pas si le nom de la propriété était event, donc je l'ai changé en name.)

Je pense que le problème avec votre code était que le noeud location récupéré lors de la création du type anonyme ne recherchait pas le noeud avec la valeur souhaitée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X