web-dev-qa-db-fra.com

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

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?

117
rlandster

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.

206
Dimitre Novatchev

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.

15
rlandster