2010-08-11 6 views
4

Si je reçois le chemin vers un nœud spécifique en tant que chaîne puis-je trouver en quelque sorte facilement noeud en utilisant Linq/Méthode de la XElement (ou XDocument).Comment puis-je trouver un noeud XML par chemin dans LINQ to XML

Il y a tellement de différents types d'objets XML, il serait également bien si un bonus supplémentaire que vous pourriez me pointer vers un guide pourquoi/comment utiliser différents types.

EDIT: Ok après avoir été pointé vers XPathSelectElement je l'essayer pour que je puisse lui donner la bonne réponse, je ne peux pas tout à fait le faire fonctionner bien. C'est le XML j'essayer

<Product> 
    <Name>SomeName</Name> 
    <Type>SomeType</Type> 
    <Quantity>Alot</Quantity> 
</Product> 

et mon code

string path = "Product/Name"; 
string name = xml.XPathSelectElement(path).Value; 

note ma chaîne vient d'ailleurs donc je suppose qu'il ne doit pas être littérale (au moins en mode débogage ça ressemble à celui ci-dessus). J'ai aussi essayé d'ajouter/devant. Cela me donne une référence nulle.

Répondre

8

Essayez d'utiliser la méthode d'extension XPathSelectElement de XElement. Vous pouvez passer la méthode à une expression XPath à évaluer. Par exemple:

XElement myElement = rootElement.XPathSelectElement("//Book[@ISBN='22542']"); 

Modifier:

En réponse à votre édition, vérifiez votre expression XPath. Si votre document ne contient que ce petit extrait alors /Product/Name fonctionnera comme la principale barre oblique effectue une recherche à partir de la racine du document:

XElement element = document.XPathSelectElement("/Product/Name"); 

S'il y a d'autres produits et <Product> n'est pas le nœud racine, vous devrez modifier le XPath que vous utilisez.

+0

Je ne pouvais pas à reconnaître XPathSlectElement jusqu'à ce que j'ajouté manuellement l'instruction Using. Cependant, cela ne fonctionne pas comme je l'espérais. Pourriez-vous me dire ce qui ne va pas (voir la modification ci-dessus) afin que je puisse vous donner une réponse acceptée? –

+0

La variable nommée xml est juste la partie que j'ai mentionnée mais elle fait partie d'un arbre XML plus grand et cette partie a été passée en paramètre. Si je vérifie la variable xml en mode débogage, il montre le code XML du produit ci-dessus. J'ai aussi essayé de mettre dans le Xpath original et ça ne marche pas non plus. Ok –

+0

a finalement obtenu à travailler en utilisant (« ./Name ») –

5

Vous pouvez également utiliser XPathEvaluate

XDocument document = XDocument.Load("temp.xml"); 
var found = document.XPathEvaluate("/documents/items/item") as IEnumerable<object>; 
foreach (var obj in found) 
{ 
    Console.Out.WriteLine(obj);  
} 

Compte tenu du code XML suivant:

<?xml version="1.0" encoding="utf-8" ?> 
<documents> 
    <items> 
    <item name="Jamie"></item> 
    <item name="John"></item> 
    </items> 
</documents> 

Cela devrait imprimer le contenu du nœud articles.

+0

Cela pourrait être utile lorsque vous avez beaucoup avec le même nom, merci. –