Il existe un fichier HTML (dont je ne contrôle pas le contenu) qui contient plusieurs input
éléments tous avec le même id
attribut fixe de "search_query"
. Le contenu du fichier peut changer, mais je sais que je veux toujours obtenir le deuxième input
élément avec l'attribut id "search_query"
.
J'ai besoin d'une expression XPath pour ce 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>
Gardez à l'esprit 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 input
éléments 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 l'expression XPath correcte?
Réponses:
Ceci est une FAQ :
//somexpression[$N]
signifie "Trouver chaque nœud sélectionné par
//somexpression
qui est le$N
ième enfant de son parent".Ce que tu veux c'est :
N'oubliez pas : l'
[]
opérateur a une priorité (priorité) plus élevée que l'//
abréviation.la source
//input[@id='search_query'][2]
est:/descendat-or-self::node()/child::input[attribute::id='search_query'][position()=2]
Cela semble fonctionner:
Je vais cela de "XSLT 2.0 et XPath 2.0 Programmer's Reference, 4th Edition" par Michael Kay.
Il y a aussi une note dans la section "Syntaxe abrégée" de la spécification XML Path Language http://www.w3.org/TR/xpath/#path-abbrev qui a fourni un indice.
la source