La requête d'un XDocument pour les éléments par nom de toute profondeur
J'ai un XDocument
objet. Je veux requête pour les éléments avec un nom particulier à n'importe quelle profondeur à l'aide de LINQ. Lorsque j'utilise Descendants("element_name")
, je ne reçois que des éléments qui sont les enfants directs du niveau actuel. Ce que je recherche est l'équivalent de "//element_name" dans XPath...devrais-je utiliser XPath
, ou est-il un moyen de le faire en utilisant des méthodes LINQ? Merci.
Vous devez vous connecter pour publier un commentaire.
Descendants devrait fonctionner très bien. Voici un exemple:
Résultats:
doc.Descendants("Cars").Descendants("Part")
(ou peut-être.Elements("Part")
s'ils n'étaient que des enfants directs.var foo = new XDocument().Descendants("Bar").Descendants("Baz");
Parce queDescendants
retourne un videIEnumerable<XElement>
et pasnull
.Un exemple indiquant l'espace de noms:
Vous pouvez le faire de cette façon:
où
xml
est unXDocument
.Être conscient que la propriété
Name
retourne un objet qui a uneLocalName
et unNamespace
. C'est pourquoi vous devez utiliserName.LocalName
si vous voulez comparer par son nom.Descendants vont faire exactement ce dont vous avez besoin, mais assurez-vous que vous avez inclus un espace de nom et le nom de l'élément. Si vous l'omettez, vous obtiendrez probablement une liste vide.
Il y a deux façons de le faire,
Suivantes sont des exemples d'utilisation de ces approches,
Si vous utilisez une expression XPath, vous avez besoin de faire des manipulations avec l'interface IEnumerable:
Noter que
résultats, soit un pointeur null, ou pas de résultats.
XPathEvaluate
est dans leSystem.Xml.XPath
espace de noms.Je suis en utilisant
XPathSelectElements
méthode d'extension qui fonctionne de la même manière àXmlDocument.SelectNodes
méthode:Suivant @Francisco Goldenstein réponse, j'ai écrit une méthode d'extension
nous savons que le ci-dessus est vrai. Jon ne se trompe jamais; la vie réelle souhaite peut aller un peu plus loin
Par exemple, Habituellement, le problème est, comment pouvons-nous obtenir EchoToken ci-dessus document xml? Ou comment le flou de l'élément avec le nom attrbute.
1 - Vous pouvez les trouver en accédant à l'espace de noms et le nom comme ci-dessous
2 - Vous pouvez trouver le contenu d'un attribut de valeur, comme celui-ci
Ce ma variante de la solution basée sur
Linq
et de Descendants de la méthode de laXDocument
classeRésultats:
Pour plus de détails sur le
Desendants
méthode de prendre un coup d'oeil ici.(Code et les Instructions pour le C# et peut-être besoin d'être légèrement modifié pour les autres langues)
Cet exemple fonctionne parfaitement si vous souhaitez lire à partir d'un Nœud Parent qui a beaucoup d'enfants, par exemple de regarder le code XML suivant;
Maintenant avec ce code ci-dessous (en gardant à l'esprit que le Fichier XML est stocké dans des ressources (Voir les liens à la fin de l'extrait de code pour obtenir de l'aide sur les ressources), Vous pouvez obtenir chaque adresse e-mail dans le "e-mails" tag.
Résultats
Remarque: Pour l'Application de la Console et WPF ou Windows Forms, vous devez l'ajouter à la section "utilisation du Système.Xml.Linq;" l'Aide de la directive en haut de votre projet, pour Console, vous aurez également besoin d'ajouter une référence à cet espace de noms avant de les ajouter à l'Aide de la directive. Aussi pour la Console il n'y aura pas de fichier de Ressources par défaut dans les "Propriétés du dossier" donc, vous devez ajouter manuellement le fichier de Ressources. La MSDN articles ci-dessous, l'expliquer en détail.
Ajout et Modification des Ressources
Comment: Ajouter ou Supprimer des Ressources