Le XPath bookstore/book[1]
sélectionne le premier nœud de livre sousbookstore
.
Comment puis-je sélectionner le premier nœud qui correspond à une condition plus compliquée, par exemple le premier nœud qui correspond /bookstore/book[@location='US']
/bookstore/book[@location='US'][1]
ne renvoie pas tous les livres des «États-Unis». Je l'ai testé plusieurs fois et sous des implémentations xpath de différents langages./bookstore/book[@location='US'][1]
renvoie le premier livre «américain» dans une librairie. S'il y a plusieurs librairies, elle retournera la première de chacune. C'est ce que l'OP a demandé (le premier nœud sous librairie). Votre version ne renvoie qu'un seul livre de toutes les librairies (le premier match)./bookstore/book[@location='US'][1]
ne fonctionne qu'avec une structure simple.Ajoutez un peu plus de structure et les choses se cassent.
Avec
/bookstore/category/book[@location='US'][1]
les rendementspas "le premier nœud qui correspond à une condition plus compliquée".
/bookstore/category/book[@location='US'][2]
ne renvoie rien.Entre parenthèses, vous pouvez obtenir le résultat pour lequel la question d'origine était:
(/bookstore/category/book[@location='US'])[1]
donneet
(/bookstore/category/book[@location='US'])[2]
fonctionne comme prévu.la source
/bookstore/book[1]
et NON(/bookstore/book)[1]
. Le cas que vous avez fourni n'est pas le même que celui demandé par OP. Vraisemblablement, OP a accepté ma réponse car elle a fait ce qu'il attendait (et a demandé).'(//div[text() = "'+ name +'"])[1]/following-sibling::*/div/text()'
. Dans le cas où il y a plusieurs correspondances de nœudsname
.Pour expliquer la réponse de Jonathan Fingland:
[position()=1 and @location='US']
) doivent être vraies dans leur ensemble[position()=1][@location='US']
) doivent être vraies l' une après l'autre[position()=1][@location='US']
! =[@location='US'][position()=1]
while
[position()=1 and @location='US']
==[@location='US' and position()=1]
[position()=1]
peut être abrégé en[1]
Vous pouvez construire des expressions complexes prédicats avec les opérateurs booléens «
and
» et «or
», et avec les fonctions XPath booléennenot()
,true()
etfalse()
. De plus, vous pouvez mettre des sous-expressions entre parenthèses.la source
Le moyen le plus simple de trouver le premier nœud de livre en anglais (dans tout le document), en tenant compte d'un fichier xml structuré plus compliqué, comme:
est l'expression xpath:
la source
Compte tenu de ce qui précède; vous pouvez sélectionner le premier livre avec
Et cela trouvera le premier n'importe où qui a un emplacement aux États-Unis. [A1]
Renvoyer l'ensemble de nœuds avec tous les livres avec l'emplacement US. [A1, B1, C2]
Renvoyer le premier emplacement de livre US qui existe dans une catégorie n'importe où dans le document. [B1]
retournera le premier livre avec l'emplacement US qui existe n'importe où sous la librairie de l'élément racine; rendant vraiment la partie / librairie redondante. [A1]
En réponse directe:
Vous renverra le premier nœud de l'élément livre avec l'emplacement US qui se trouve sous la librairie [A1]
Soit dit en passant si vous vouliez, dans cet exemple, trouver le premier livre américain qui n'était pas un enfant direct de la librairie:
la source
Utilisez l'index pour obtenir le nœud souhaité si xpath est compliqué ou si plusieurs nœuds sont présents avec le même xpath.
Ex:
Vous pouvez donner le numéro du nœud que vous souhaitez.
la source
si l'espace de noms est fourni sur le xml donné, il vaut mieux l'utiliser.
la source
par ex.
Et
la source
Avec l'aide d'un testeur xpath en ligne, j'écris cette réponse ...
Pour cela:
le xpath suivant:
les sorties:
Puisque 1 signifie sélectionner tous les éléments td qui sont le premier enfant de leur propre parent direct.
Mais le xpath suivant:
les sorties:
la source