Es gibt eine HTML-Datei (deren Inhalt ich nicht kontrolliere), die mehrere input
Elemente mit demselben festen id
Attribut von enthält "search_query"
. Der Inhalt der Datei kann sich ändern, aber ich weiß, dass ich immer das zweite input
Element mit dem ID-Attribut erhalten möchte "search_query"
.
Ich brauche dazu einen XPath-Ausdruck. Ich habe es 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>
Beachten Sie, dass das Obige nur ein Beispiel ist und der andere HTML-Code sehr unterschiedlich sein kann und die input
Elemente überall ohne konsistente Dokumentstruktur angezeigt werden können (außer dass ich garantiert bin, dass es immer mindestens zwei input
Elemente mit dem ID-Attribut von gibt "search_query"
).
Was ist der richtige XPath-Ausdruck?
Antworten:
Dies ist eine FAQ :
//somexpression[$N]
bedeutet "Finde jeden Knoten, der von
//somexpression
diesem ausgewählt wird , ist das$N
th Kind seines Elternteils".Was Sie wollen ist :
Denken Sie daran : Der
[]
Operator hat eine höhere Priorität (Priorität) als die//
Abkürzung.quelle
//input[@id='search_query'][2]
ist:/descendat-or-self::node()/child::input[attribute::id='search_query'][position()=2]
Das scheint zu funktionieren:
Ich gehe dies 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.
quelle