124 votes

Requête XPath pour obtenir la nième instance d'un élément

Il y a un fichier HTML (dont je ne contrôle pas le contenu) qui comporte plusieurs input tous les éléments avec le même fixe id l'attribut de "search_query" . Le contenu du fichier peut changer, mais je sais que je veux toujours obtenir le second input 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 cela ne fonctionne 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 le code HTML peut être tout à fait différent. input peuvent apparaître n'importe où, sans que la structure du document soit cohérente (sauf que je suis certain qu'il y aura toujours au moins deux éléments input dont l'attribut id est "search_query" ).

Quelle est l'expression XPath correcte ?

217voto

Dimitre Novatchev Points 147842

Il s'agit d'une FAQ :

//somexpression[$N]

signifie "Trouver chaque nœud sélectionné par //somexpression qui est le $N e enfant de son parent".

Ce que vous voulez, c'est :

(//input[@id="search_query"])[2]

Souvenez-vous de : Le site [] a une préséance (priorité) plus élevée que l'opérateur // abréviation.

16voto

rlandster Points 1614

Cela semble fonctionner :

/descendant::input[@id="search_query"][2]

Je tire ceci de "XSLT 2.0 and XPath 2.0 Programmer's Reference, 4th Edition" de Michael Kay.

Il y a é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 a fourni un indice.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X