web-dev-qa-db-ja.com

xpathの// nodeと/ descendant :: nodeの違いは何ですか?

私は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']
32
Dave Hunt

http://www.w3.org/TR/xpath#path-abbrev を参照してください

//は、descendant :: axisの単なる省略形です

編集

引用するには:

// paraは/ descendant-or-self :: node()/ child :: paraの略です

つまり、コンテキストノードの子またはコンテキストノードの子孫であるすべてのパラを指します。私が知る限り、それはコンテキストノードの子孫のパラに変換されます。

35

コンテキストグループに違いがあります。 _//para[1]_は/descendant-or-self::node()/child::para[1]の略で、親の最初の子であるすべてのパラを返します。 _/descendant::para[1]_は、サブツリー全体の最初のパラのみを返します。

11
Motty

あなたの場合

_ 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 から取得されました

4
JBakouny

簡潔さ以外は違いはわかりません。

2
Allain Lalonde