2009-11-26 9 views
4

Mine est une question générale sur les pratiques d'analyse XML.Analyse XML avec C#, XPath

Disons que nous avons un document XML, et nous utilisons XPath pour obtenir un nœud de ce document:

XMLNode node1=XMLDoc.SelectSingleNode("/SomeNode/SomeOtherNode"); 

maintenant n contient les données de SomeOtherNode. Intuitivement, je me attends la ligne de code suivante:

XMLNode node2=XMLDoc.SelectSingleNode("/Child"); 

pour alimenter node2 avec les enfants de node1 qui sont nommés « enfant ». Mais malheureusement, cela ne fonctionne pas de cette façon. La recherche XPath commence à partir de la racine du document et non à partir de l'objet XMLNode sur lequel elle a été appelée. Y a-t-il un moyen de le faire fonctionner de manière «intuitive»? Cela serait pratique pour une approche récursive ou orientée objet de l'analyse.

J'ai essayé d'utiliser l'objet XMLPathNavigator mais cela fonctionne de la même manière. Et il semble que je puisse définir le texte interne d'un XMLDocumentFragment dans le texte interne du nœud donné, mais cela semble être une duplication inefficace des données.

Des idées?

+0

Si vous utilisez C# 3 ou supérieur, pensez à utiliser LINQ to XML. Voir http://msdn.microsoft.com/en-us/library/bb387098.aspx – TrueWill

Répondre

8
XMLNode node2 = XMLDoc.SelectSingleNode("/Child"); 

Cela permet de sélectionner l'élément appelé « enfant » à partir de la racine (/). Notez que vous appliquez l'appel sur XMLDoc, et non sur node1, donc ce sera par rapport à la racine du document. Je pense que ce que vous voulez est:

XMLNode node2 = node1.SelectSingleNode("Child"); // edit: removed slash 

Qui est un XPath par rapport au nœud précédemment sélectionné, pas la racine du document.

Sinon, vous pouvez faire:

XMLNode node = XMLDoc.SelectSingleNode("/SomeNode/SomeOtherNode/Child") 

qui choisira le nœud enfant directement.

+0

Oh désolé, j'ai mal tapé dans le post. node1.SelectSingleNode ("/ Child"); est ce que j'ai essayé, il regarde toujours le nœud racine du document. – Vercinegetorix

+0

votre second exemple ne fonctionne pas: node1.SelectSingleNode ("/ Child"); node1 a une référence à la racine du document, et lorsque vous sélectionnez avec une barre oblique initiale, il recherche à partir de la racine du document. Pour le rendre relatif au noeud 1, vous devez supprimer la barre oblique. – dan

+0

Oups, désolé, ce slash était une faute de frappe de ma part. –

0

je crois qu'il devrait être:

XMLNode node2=XMLDoc.SelectSingleNode(".//Child"); 

(note point).

0

en utilisant // au lieu de/correspondra à tous les nœuds avec le nom donné.

/Sélectionne à partir du nœud racine

// Choisit noeuds dans le document à partir du nœud actuel qui correspondent à la sélection, peu importe où ils sont