私はSeleniumを使用してWebページで要素を検索するときに多くのXPathを使用しており、最近ではnode1 // node2の使用からnode1/descendant :: node2の使用に移行しました。 2つの方法の違いは何ですか? 1つは他よりも効率的ですか?
例示するXMLスニペットの例:
<div id="books">
<table>
<tr><td class="title">Lord of the Rings</td><td class="author">JRR Tolkein</td></tr>
<tr><td class="title">The Hitch-Hikers Guide to the Galaxy</td><td class="author">Douglas Adams</td></tr>
</table>
</div>
だからそれは:
id( 'books')// td [@ class = 'title']
または:
id( 'books')/ descendant :: td [@ class = 'title']
http://www.w3.org/TR/xpath#path-abbrev を参照してください
//は、descendant :: axisの単なる省略形です
編集
引用するには:
// paraは/ descendant-or-self :: node()/ child :: paraの略です
つまり、コンテキストノードの子またはコンテキストノードの子孫であるすべてのパラを指します。私が知る限り、それはコンテキストノードの子孫のパラに変換されます。
コンテキストグループに違いがあります。 _//para[1]
_は/descendant-or-self::node()/child::para[1]
の略で、親の最初の子であるすべてのパラを返します。 _/descendant::para[1]
_は、サブツリー全体の最初のパラのみを返します。
あなたの場合
_ id('books')//td[@class='title']
_
そして:
_ id('books')/descendant::td[@class='title']
_
同じ結果を返します。
しかし、実際には、すでに述べたように、id('books')//td[@class='title']
はid('books')/descendant-or-self::node()/td[@class='title']
を意味し、概念的にはid('books')/descendant::td[@class='title']
とは異なります。
次の注を参照してください。
注:ロケーションパス// para [1]は、ロケーションパス/ descendant :: para [1]と同じ意味ではありません。後者は、最初の子孫パラ要素を選択します。前者は、親の最初のパラ子であるすべての子孫パラ要素を選択します。
このメモは http://www.w3.org/TR/xpath#path-abbrev から取得されました
簡潔さ以外は違いはわかりません。