Il existe un fichier HTML (dont je ne contrôle pas le contenu) qui contient plusieurs éléments input
avec tous le même attribut id
fixe de "search_query"
. Le contenu du fichier peut changer, mais je sais que je veux toujours obtenir le deuxième élément input
avec l'attribut id "search_query"
.
J'ai besoin d'une expression XPath pour le faire. J'ai essayé //input[@id="search_query"][2]
mais ça ne marche pas. Voici un exemple de chaîne XML où cette requête a échoué:
<div>
<form>
<input id="search_query" />
</form>
</div>
<div>
<form>
<input id="search_query" />
</form>
</div>
<div>
<form>
<input id="search_query" />
</form>
</div>
N'oubliez pas que ce qui précède n'est qu'un exemple et que l'autre code HTML peut être très différent et que les éléments input
peuvent apparaître n'importe où sans structure de document cohérente (sauf que je suis assuré qu'il y aura toujours au moins deux input
éléments avec un attribut id de "search_query"
).
Quelle est la bonne expression XPath?
Ceci est une FAQ:
//somexpression[$N]
signifie "Trouver tous les nœuds sélectionnés par //somexpression
C'est le $N
ème enfant de son parent ".
Ce que vous voulez c'est:
(//input[@id="search_query"])[2]
Rappelez-vous: Le []
L’opérateur a une priorité plus élevée que l’opérateur //
abréviation.
Cela semble fonctionner:
/descendant::input[@id="search_query"][2]
Je vais ceci de "Référence du programmeur XSLT 2.0 et XPath 2.0, 4ème édition" de Michael Kay.
Il existe également une note dans la section "Syntaxe abrégée" de la spécification du langage de chemin XML http://www.w3.org/TR/xpath/#path-abbrev qui fournit un indice.