要素のn番目のインスタンスを取得するXPathクエリ


135

HTMLファイル(そのコンテンツは私が制御しません)がありinput、すべて同じ固定id属性の要素がいくつかあり"search_query"ます。ファイルの内容は変更される可能性がありますが、私は常にinputid属性を持つ2番目の要素を取得したいことを知っています"search_query"

これを行うにはXPath式が必要です。試しまし//input[@id="search_query"][2]たがうまくいきません。このクエリが失敗したXML文字列の例を次に示します。

<div>
  <form>
    <input id="search_query" />
   </form>
</div>

<div>
  <form>
    <input id="search_query" />
  </form>
</div>

<div>
  <form>
    <input id="search_query" />
  </form>
</div>

上記は単なる例であり、他のHTMLコードはかなり異なる可能性があり、input要素は一貫したドキュメント構造がなくてもどこにでも表示できることに注意してください(ただしinput、id属性が常に2つ以上あることが保証されます)"search_query")。

正しいXPath式は何ですか?


良い質問です、+ 1。問題の完全な説明と必要な解決策については、私の回答を参照してください。
Dimitre Novatchev、

7
マイナーポイント:特定のIDを持つ要素を複数持つことはできません(そのため、質問のHTMLは実際には無効です)。実際には、ブラウザはとにかくそれを許可しますが、許可すると、IDを使用することの唯一の利点を逃してしまいます。一意の記号)。
machineghost 2016

回答:


244

これはFAQです。

//somexpression[$N]

//somexpressionそれによって選択されたすべてのノード$Nをその親のth番目の子にする」を意味します。

あなたが欲しいものは

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

覚えておいてください[]演算子は//省略形よりも優先度(優先度)が高くなっています。


6
私はこの答えが好きです。私は優先順位の問題を考慮していませんでした(単純な左から右への優先順位を仮定しました)。
rlandster

10
@rlandster:「優先」という言葉は紛らわしいかもしれません。非省略形は//input[@id='search_query'][2]次のとおりです。/descendat-or-self::node()/child::input[attribute::id='search_query'][position()=2]

21
Googleからここに来た人-番号は1から始まります-[1]が最初の要素で、以下
Jan Mares

これらのXPathクエリでこれらの種類の配列が1で始まるのは奇妙で、混乱しています。
Ivotje50

Ivotje50はいXPathの配列およびアレイは1ベースれる@
Dimitre Novatchev

21

これはうまくいくようです:

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

これは、Michael Kayによる「XSLT 2.0およびXPath 2.0プログラマーズリファレンス、第4版」から引用しています。

また、手がかりを提供するXMLパス言語仕様http://www.w3.org/TR/xpath/#path-abbrevの「省略された構文」セクションにも注記があります


この回答に感謝します。私の場合、ロボットフレームワークでxpathを使用しているため、受け入れられたソリューションは機能しません。ブラケットで始まるパスは受け入れられません。この1つはしかし、トリックを行う必要があります
dahui
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.