Es gibt eine HTML-Datei (deren Inhalt ich nicht kontrolliere), die mehrere input
Elemente mit demselben festen id
Attribut von "search_query"
Enthält. Der Inhalt der Datei kann sich ändern, aber ich weiß, dass ich immer das zweite input
-Element mit dem ID-Attribut "search_query"
Erhalten möchte.
Ich brauche einen XPath-Ausdruck, um dies zu tun. Ich habe versucht //input[@id="search_query"][2]
, Aber das funktioniert nicht. Hier ist eine XML-Beispielzeichenfolge, bei der diese Abfrage fehlgeschlagen ist:
<div>
<form>
<input id="search_query" />
</form>
</div>
<div>
<form>
<input id="search_query" />
</form>
</div>
<div>
<form>
<input id="search_query" />
</form>
</div>
Denken Sie daran, dass das Obige nur ein Beispiel ist und der andere HTML-Code sehr unterschiedlich sein kann und die input
-Elemente überall ohne konsistente Dokumentstruktur auftreten können (mit der Ausnahme, dass garantiert immer mindestens zwei vorhanden sind) input
Elemente mit dem ID-Attribut "search_query"
).
Was ist der richtige XPath-Ausdruck?
Dies ist eine FAQ:
//somexpression[$N]
bedeutet "Finde jeden von //somexpression
das ist der $N
th Kind seines Elternteils ".
Was Sie wollen, ist:
(//input[@id="search_query"])[2]
Erinnern Sie sich: Das []
Operator hat höhere Priorität (Priorität) als der //
Abkürzung.
Das scheint zu funktionieren:
/descendant::input[@id="search_query"][2]
Ich gehe davon aus "XSLT 2.0 und XPath 2.0 Programmer's Reference, 4th Edition" von Michael Kay.
Es gibt auch einen Hinweis im Abschnitt "Abgekürzte Syntax" der XML Path Language-Spezifikation http://www.w3.org/TR/xpath/#path-abbrev , der einen Hinweis lieferte.