0

どちらのクエリも、5 回以上いいねされた写真を取得します。私が思うに、クエリ 1 は相対パスを定義しますが、クエリ 2 は定義しません。そのため、クエリ 2 は「祖先」を使用します。私は正しいですか?どちらが良いですか?

最初のクエリ:

//div[@class="pin"]
     [.//span[@class = 'LikesCount']
             [substring-before(normalize-space(.),' ') > 5]]
     /div[@class="PinHolder"]
     /a/img

2 番目のクエリ:

//div[@class="pin"]/p/span[@class="LikesCount"]
[substring-before(., " ") > 5]/ancestor::div[@class="pin"]/a/img

マークアップに従います:

<div class="pin">

[...]

<div class="PinHolder">
<a href="/pin/56787645270909880/" class="PinImage ImgLink">
    <img src="http://media-cache-ec3.pinterest.com/upload/56787645270909880_d7AaHYHA_b.jpg" 
         alt="Krizia" 
         data-componenttype="MODAL_PIN" 
         class="PinImageImg" 
         style="height: 288px;">
</a>
</div>

<p class="stats colorless">
    <span class="LikesCount"> 
        22 likes 
    </span>
    <span class="RepinsCount">
        6 repins
    </span>
</p>

[...]

</div>
4

1 に答える 1

2

異なる結果を返す可能性のあるいくつかの違いと、違いをもたらさないいくつかの違いがあります。いくつかの違いは、ある入力では式 (またはそのような式) の値に影響し、他の入力では影響しません。

  • 最初の式は、次のパスに一致する要素 (のサブセット) を探します。

    //div[@class='pin']/div[@class='PinHolder']/a/img
    

    2 番目は、このパスに一致する要素 (のサブセット) を探します。

    //div[@class='pin']/a/img
    

    したがって、この 2 つは重複する結果を返すことはありません。

  • spanクラスの条件をチェックする際LikesCount、最初の式はnormalize-space、最初のトークンを抽出する前に関数をスパンの文字列値に適用します。2番目はそうではありません。サンプル マークアップのような文字列値 (改行、8 つの空白、「22 likes」、空白、改行、4 つの空白) を指定すると、違いが生じる場合があります。環境が XPath 式を評価する前に空白を正規化する場合、違いがない可能性があります。

  • span各式は class の要素をテストしLikesCountます。div最初の式はwith クラスのすべての子孫の中からそのようなスパンを探しますがpin、2 番目の式は親が である孫の中だけでそれを探しますp。示されているサンプル XML では、これらは同じことになります (最初の式はLikesCount、2 番目の式でも検出されないクラスのスパンを検出しません。

  • div2 番目の式で祖先軸を使用しているため、 class のネストされた要素を持つドキュメントの場合によっては、2 つの式が異なる結果を返しpinます。入力にそのようなネストされた要素がない場合div、この定式化の違いは、それらが返す値に違いをもたらしません。

  • 最初の式は、空白が XPath にとって重要でない場所で、2 番目の式よりも多くの空白を使用します。これにより、一部の読者にとって最初の式が読みやすくなる場合があります。また、より多くのスペースを必要とします (これを嫌う読者もいます)。式 1 の述語のインデントにより、同じノードに対して適用される述語が上下に直接配置されます。これにより、一部の読者はそれらが同じノードに適用されることがわかります。まれに、XPath 式の重要でない空白を処理する準備ができていない XPath エバリュエーターに遭遇しました。もちろん、一部のプログラミング言語では、複数行の文字列に対して特別な処理が必要になるため、最初の式の複数行のインデント形式は使いにくい場合があります。一部の環境では、合法的な XPath ですが。

「クエリ 1 は相対パスを定義しているのに対し、クエリ 2 は定義していないため、クエリ 2 は「祖先」を使用していると思います。私は正しいですか?」と書いています。意味がよくわからないので、この回答の試みは役に立たないかもしれません (申し訳ありません)。最初の式は likes-count スパンに関するテストをdivof classの述語に入れpin、2 番目の式はスパンに移動してテストを実行し、次にdivclass を持つ要素であるすべての祖先のセットに戻りpinます。示されているような XML では、これらの定式化は同じ効果があります。divclass の要素pinがネストできる場合は、わずかに異なる結果が生じる可能性があります。しかし、テストと走査の問題の正確な定式化。

「どっちがいい?」と聞かれます。現在、それらは異なる結果を返すため、これを決定する最初の方法は、「質問したい質問を表現しているのはどれですか?」と尋ねることです。

それらが同じ結果を返すように変更された場合、質問は「どちらが理解しやすいと思いますか?」になるので、コードを保守するときに、何が起こっているかを確認できますか?

于 2012-12-17T16:02:39.617 に答える