web-dev-qa-db-fra.com

Quelle est la différence entre // node et / descendant :: node dans xpath?

J'utilise beaucoup de XPath lors de la localisation d'éléments dans des pages Web à l'aide de Selenium, et j'ai récemment abandonné l'utilisation de node1 // node2 pour utiliser node1/descendant :: node2. Quelle est la différence entre les deux méthodes? L'un est-il plus efficace que l'autre?

Exemple d'extrait XML pour illustrer:

<div id="books">
  <table>
    <tr><td class="title">Lord of the Rings</td><td class="author">JRR Tolkein</td></tr>
    <tr><td class="title">The Hitch-Hikers Guide to the Galaxy</td><td class="author">Douglas Adams</td></tr>
  </table>
</div>

Ce serait donc:

id ('livres') // td [@ class = 'title']

ou:

id ('livres')/descendant :: td [@ class = 'title']
32
Dave Hunt

voir http://www.w3.org/TR/xpath#path-abbrev

// n'est qu'une abréviation pour le descendant :: axe

Modifier

Citer:

// para est l'abréviation de/descendant-or-self :: node ()/child :: para

C'est-à-dire qu'il fait référence à tous les para qui sont des enfants du nœud de contexte ou de tout nœud descendant du nœud de contexte. Pour autant que je sache, cela se traduit par n'importe quel para descendant du nœud de contexte.

35

Il y a une différence dans le groupe de contexte. //para[1] Est l'abréviation de /descendant-or-self::node()/child::para[1], qui retourne chaque para qui est le premier enfant de son parent. /descendant::para[1] Renvoie uniquement le premier paragraphe de la sous-arborescence entière.

11
Motty

Dans ton cas

 id('books')//td[@class='title']

et:

 id('books')/descendant::td[@class='title']

retourner le même résultat.

Mais en fait, comme cela a déjà été dit précédemment, id('books')//td[@class='title'] signifie id('books')/descendant-or-self::node()/td[@class='title'] qui est différent de id('books')/descendant::td[@class='title'] dans son concept.

Voir la note suivante:

REMARQUE: le chemin d'emplacement // para [1] ne signifie pas la même chose que le chemin d'emplacement/descendant :: para [1]. Ce dernier sélectionne le premier élément para descendant; le premier sélectionne tous les éléments para descendants qui sont les premiers enfants para de leurs parents.

cette note est tirée de http://www.w3.org/TR/xpath#path-abbrev

4
JBakouny

Mis à part la lacune, je ne suis au courant d'aucune différence.

2
Allain Lalonde