J'ai un XDocument
objet. Je veux interroger des éléments avec un nom particulier à n'importe quelle profondeur en utilisant LINQ. Lorsque j'utilise Descendants("element_name")
, je n'obtiens que des éléments qui sont des enfants directs du niveau actuel. Ce que je recherche, c'est l'équivalent de "// nom_élément" dans XPath ... devrais-je simplement utiliser XPath
, ou y a-t-il un moyen de le faire en utilisant les méthodes LINQ? Merci.
143
doc.Descendants("Cars").Descendants("Part")
(ou peut.Elements("Part")
- être s'ils n'étaient que des enfants directs.var foo = new XDocument().Descendants("Bar").Descendants("Baz");
CarDescendants
renvoie un videIEnumerable<XElement>
et nonnull
.Un exemple indiquant l'espace de noms:
la source
Vous pouvez le faire de cette façon:
où
xml
est unXDocument
.Sachez que la propriété
Name
renvoie un objet qui a unLocalName
et unNamespace
. C'est pourquoi vous devez utiliserName.LocalName
si vous souhaitez comparer par nom.la source
Les descendants feront exactement ce dont vous avez besoin, mais assurez-vous que vous avez inclus un nom d'espace de noms avec le nom de l'élément. Si vous l'omettez, vous obtiendrez probablement une liste vide.
la source
Il y a deux façons d'accomplir cela,
Voici des exemples d'utilisation de ces approches,
Si vous utilisez XPath, vous devez effectuer quelques manipulations avec IEnumerable:
Notez que
résultats soit un pointeur nul, soit aucun résultat.
la source
XPathEvaluate
c'est dans l'System.Xml.XPath
espace de noms.J'utilise une
XPathSelectElements
méthode d'extension qui fonctionne de la même manière que laXmlDocument.SelectNodes
méthode:la source
Suite à la réponse de @Francisco Goldenstein, j'ai écrit une méthode d'extension
la source
nous savons que ce qui précède est vrai. Jon n'a jamais tort; les souhaits de la vraie vie peuvent aller un peu plus loin
Par exemple, généralement, le problème est, comment pouvons-nous obtenir EchoToken dans le document xml ci-dessus? Ou comment brouiller l'élément avec le nom attrbute.
1- Vous pouvez les trouver en accédant avec l'espace de noms et le nom comme ci-dessous
2- Vous pouvez le trouver par la valeur du contenu de l'attribut, comme celui-ci
la source
Ceci ma variante de la solution basée sur
Linq
et la méthode Descendants de laXDocument
classeRésultats:
Pour plus de détails sur la
Desendants
méthode, jetez un œil ici.la source
(Le code et les instructions sont pour C # et peuvent devoir être légèrement modifiés pour d'autres langues)
Cet exemple fonctionne parfaitement si vous souhaitez lire à partir d'un nœud parent qui a de nombreux enfants, par exemple, regardez le code XML suivant;
Maintenant, avec ce code ci-dessous (en gardant à l'esprit que le fichier XML est stocké dans les 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 la balise "emails".
Résultats
Remarque: pour l'application console et WPF ou Windows Forms, vous devez ajouter "using System.Xml.Linq;" En utilisant la directive en haut de votre projet, pour Console, vous devrez également ajouter une référence à cet espace de noms avant d'ajouter la directive Using. Aussi pour la console, il n'y aura pas de fichier de ressources par défaut sous le "dossier Propriétés", vous devez donc ajouter manuellement le fichier de ressources. Les articles MSDN ci-dessous expliquent cela en détail.
Ajout et modification de ressources
Comment: ajouter ou supprimer des ressources
la source