web-dev-qa-db-ja.com

XPathの.//と// *の違いは何ですか?

Firebugを介して相対XPathを見つけている間、次のように作成されます

  1. .//*[@id='Passwd']---------開始時にドットを使用しないとどうなるか?

  2. Xpathに//*を追加するだけです-ハイライトされます---さまざまなページ要素----------それは何を意味しますか?

以下は、GmailのパスワードフィールドのXPathです。 *の重要性は何ですか?

  • .//*[@id='Passwd']

  • //child::input[@type='password']

18
TEST-M

これらの式はすべて異なるノードセットを選択します。

.//*[@id='Passwd ']

「。」開始は、現在の処理が現在のノードから開始することを意味します。 「*」は、「Passwd」に等しい@id- attribute-valueを持つこの現在のノードから派生するすべての要素ノードを選択します。

最初にドットを使用しない場合、それが意味するものは何ですか?

次に、wholeドキュメントで@id- attribute-valueが「Passwd」に等しいすべての要素ノードを選択します。

XPathに// *を追加するだけで強調表示されます---さまざまなページ要素

これにより、wholeドキュメント内のすべての要素ノードが選択されます。

以下に言及します:GmailのXPathtのパスワードフィールドは*の意味は何ですか?

.//*[@id='Passwd']

これにより、@id- attribute-valueが「Passwd」に等しい現在のノードから降順のすべての要素ノードが選択されます。

// child :: input [@ type = 'password']

これは、@type- attribute-valuesが「password」に等しいinputという名前のすべての子要素ノードを選択します。 child::軸プレフィックスは、デフォルトの動作であるため、省略できます。

適切な式を選択する構文は ここw3school.com で説明されています。

そして、Axes(処理の現在のポイント)が説明されています ここで別のw3school.comページで

23
zx485

ここで重要なXPathの概念がいくつかあります...

絶対vs相対XPath(/ vs .

  • /は、ドキュメントのルートから始まる絶対ロケーションパスを導入します。
  • .は、コンテキストノードから始まる相対ロケーションパスを導入します。

名前付き要素と任意の要素(ename vs *

  • /enameenameルート要素を選択します
    • ./enameは、現在のノードのすべてのename子要素を選択します。
  • /*は、名前に関係なくルート要素を選択します。
    • ./*または*は、名前に関係なく、コンテキストノードのすべての子要素を選択します。

子孫または自己軸(//*

  • //enameは、ドキュメント内のすべてのename要素を選択します。
    • .//enameは、コンテキストノードまたはその下のすべてのename要素を選択します。
  • //*は、名前に関係なく、ドキュメント内のすべての要素を選択します。
    • .//*は、名前に関係なく、コンテキストノードの下にあるすべての要素を選択します。

これらの概念を念頭に置いて、特定の質問に対する回答を以下に示します...

  • .//*[@id='Passwd']は、'Passwd'と等しいid属性値を持つ現在のコンテキストノード以下のすべての要素を選択することを意味します。
  • //child::input[@type='password']//input[@type='password']に単純化でき、'password'と等しいinput属性値を持つドキュメント内のすべてのtype要素を選択することを意味します。
36
kjhughes

XPathのドットは、"コンテキストアイテム式"と呼ばれます。式の先頭にドットを置くと、コンテキスト固有になります。つまり、「XPathで要素を検索」メソッドを呼び出しているノードのコンテキストで、id="Passwd"を使用して要素を検索します。

*.//*[@id='Passwd']は、任意の要素id='Passwd'を一致させるのに役立ちます。

2
alecxe
  1. 最初の質問の場合:コンテキストがすべてです。 Syntax を見ると、「。」、「..」などの意味がわかります。また、 This Link よりも良い説明は見つからないと思います。
  2. 2番目の質問に対する簡略化された回答:通常、td、a、li、divなどのhtmlタグを使用してノードを検索します。しかし、「*」は、検索を意味します指定したプロパティに一致するタグ。 IDが「xyz」であるすべての要素のリストが任意のタグにあるように、特定のプロパティについては確信しているが、要素が付属する可能性のあるタグについては確信していない場合に主に使用されます。

それが役に立てば幸い :)

1
Prateek