2009-06-09 7 views
4

Quelle est la différence ici entre l'utilisation de "../" et de "parent" pour obtenir le nœud parent dans une requête XPath. Je pensais qu'ils étaient synonymes. Etant donné les deux requêtes XPath suivantes, y a-t-il vraiment une différence entre ces deux requêtes XPath?Quelle est la différence entre "../" et "parent" dans une requête XPath?

//Node/id[@type='image']/id[@attr1='myVal']/../../* 

//Node/id[@type='image']/id[@attr1='myVal']/parent::*/parent::* 

Je travaille sur une application C#/ASP.net et en utilisant la première requête XPath je reviens en fait le premier membre de la fratrie à l'élément de noeud. Ce que je cherche, c'est l'élément Node lui-même et tous ses enfants. La deuxième requête XPath me donnera mon résultat attendu.

Je me demande pourquoi il y a une différence ici.

Répondre

5

Réponse rapide; oui, ../ et parent :: * sont équivalents mais vous obtenez des résultats différents car vos expressions XPath sont différentes.

Réponse plus longue;

Les expressions parent :: node() et .. sont équivalentes, cette dernière étant une forme abrégée de la première selon le W3C XPath Recommendation. Vous obtiendrez un comportement similaire de parent :: *, car XML forme une arborescence, donc tout enfant peut avoir au plus un parent.

La raison pour laquelle vous obtiendrez des résultats différents est qu'il s'agit de requêtes différentes. Le premier a un extra * à la fin (../../*), ce qui renvoie probablement la séquence de l'élément enfant de votre noeud.

La seconde obtient spécifiquement le parent du parent du nœud de contexte (sous forme abrégée ../ ..), qui est votre élément Nœud d'intérêt.

Exemple:

Pour le document

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <Node> 
     <id type="image"> 
      <id attr1="myVal"> </id> 
     </id> 
    </Node> 
</root> 

Les requêtes

//Node/id[@type='image']/id[@attr1='myVal']/../../* 

et

//Node/id[@type='image']/id[@attr1='myVal']/parent::*/parent::*/* 

Retourne l'ID de nœud [@ type = 'image']

Alors que les requêtes

//Node/id[@type='image']/id[@attr1='myVal']/../.. 

et

//Node/id[@type='image']/id[@attr1='myVal']/parent::*/parent::* 

retour le nœud de nœud.

+0

Huh? Votre réponse rapide ne dit-elle pas essentiellement: oui, ils sont identiques, mais non, ils sont différents? –

+0

Mis à jour pour le rendre plus clair – Brabster

+0

C'est génial Brabster. Semble la majeure partie de ma confusion est venue de l'utilisation de "*" à la fin de la requête XPath et de ce qui revient exactement. –

5

Vous ne recevez pas le même jeu de résultat car * vos expressions sont pas équivalent à l'autre *

Tenir compte.

1.Le petit-fils du noeud cible

// Noeud/id [@ type = 'image']/[id @ attr1 = 'myVal']

2. L'enfant du noeud cible (parent de petits-enfants) (exprs équivalent)

// Noeud/id [@ type = 'image']/[id @ attr1 = 'myVal']/..

// Noeud/id [@ type = '' image ']/id [@ attr1 =' myVal ']/parent :: *

3. Le noeud cible (grand parents de petits-enfants) (équivalent) de exprs

//Node/id[@type='image']/id[@attr1='myVal']/../ ..

// Noeud/id [@ type = 'image']/[id @ attr1 = 'myVal']/parent :: */parent :: * < - * * * VOTRE 2ND EXPR * * *

4. tous les enfants de noeud cible (de exprs équivalent)

//Node/id[@type='image']/id[@attr1='myVal']/../../* < - * * * VOTRE 1ER EXPR * * *

// Noeud/id [@ type = 'image']/id [@ attr1 = 'myVal']/parent :: */parent :: */*


Essayez l'équivalent de vos expressions (par ex. '//parent/child[@id="2"]/grandchild[@id="2.1"]/../../*') au banc d'essai XPath ci-dessous. Il met en évidence en rouge quels nœuds correspondent aux différentes expressions XPath que vous alimentez.

http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm

+0

Grande description Bert. Le lien vers la page de test XPath était parfait pour tester certaines recherches et afficher les résultats. Aidé beaucoup. –

+0

+1 pour le lien utile! – Dror

Questions connexes