Istnieje plik HTML (którego zawartość nie kontroluję), który zawiera kilka input
elementów z tym samym ustalonym id
atrybutem "search_query"
. Zawartość pliku może się zmienić, ale wiem, że zawsze chcę uzyskać drugi input
element z atrybutem id "search_query"
.
Aby to zrobić, potrzebuję wyrażenia XPath. Próbowałem, //input[@id="search_query"][2]
ale to nie działa. Oto przykładowy ciąg XML, w którym to zapytanie nie powiodło się:
<div>
<form>
<input id="search_query" />
</form>
</div>
<div>
<form>
<input id="search_query" />
</form>
</div>
<div>
<form>
<input id="search_query" />
</form>
</div>
Należy pamiętać, że powyższy kod jest jedynie przykładem, a inny kod HTML może być całkiem inny, a input
elementy mogą pojawić się w dowolnym miejscu bez spójnej struktury dokumentu (poza tym, że mam gwarancję, że zawsze będą co najmniej dwa input
elementy z atrybutem id o wartości "search_query"
).
Jakie jest prawidłowe wyrażenie XPath?
Odpowiedzi:
To jest FAQ :
//somexpression[$N]
oznacza „Znajdź każdy wybrany węzeł,
//somexpression
który jest$N
dzieckiem swojego rodzica”.Chcesz :
Pamiętaj :
[]
operator ma wyższy priorytet (priorytet) niż//
skrót.źródło
//input[@id='search_query'][2]
to:/descendat-or-self::node()/child::input[attribute::id='search_query'][position()=2]
To wydaje się działać:
Wziąłem to z „XSLT 2.0 and XPath 2.0 Programmer's Reference, 4th Edition” Michaela Kaya.
Istnieje również uwaga w sekcji „Abbreviated Syntax” specyfikacji XML Path Language http://www.w3.org/TR/xpath/#path-abbrev, która zawiera wskazówkę.
źródło