web-dev-qa-db-ja.com

XPath-node()とtext()の違い

text()node()の違いを理解できません。私が理解していることから、text()はタグ<item>Apple</item>の間にあるもので、この場合はAppleです。 Nodeは、そのノードが実際に何であれ、item

しかし、その後、「プロデュース中のすべてのアイテムのテキストを選択する」ように求められ、「すべての部門のすべてのマネージャーノードを選択してください」という別の質問をする作業が割り当てられました。

出力はtext()ではなくnode()に見えると仮定します

XMLのスニペット:

<produce>
 <item>Apple</item>
 <item>banana</item>
 <item>pepper</item>
</produce>

<department>
 <phone>123-456-7891</phone>
 <manager>John</manager>
</department>

もちろん、より多くの部門とより多くのマネージャーがいますが、これは単なるコードのスニペットでした。

どんな助けも大歓迎です!

57
Pztar

text()node()は、ノードテスト、XPath用語では( compare )です。

ノードテストはノードのセット(正確には axis )で動作し、特定のタイプのノードを返します。軸が指定されていない場合、child軸がデフォルトで想定されます。

すべての種類の ノードテスト があります。

  • node()は、anyノードと一致します(それらすべての中で最も具体性の低いノードテスト)
  • text()は、textノードのみに一致します
  • comment()は、commentノードと一致します
  • *は、任意のelementノードと一致します
  • fooは、"foo"という名前の要素ノードと一致します
  • processing-instruction()はPIノードと一致します(<?name value?>のように見えます)。
  • サイドノート:*も属性ノードに一致しますが、attribute軸に沿っている場合のみです。 @*attribute::*の短縮形です。属性はchild軸の一部ではないため、通常の*は属性を選択しません。

このXMLドキュメント:

<produce>
    <item>Apple</item>
    <item>banana</item>
    <item>pepper</item>
</produce>

次のDOM(簡略化)を表します。

ルートノード
要素ノード(name = "produce")
テキストノード(value = "\ n")
要素ノード(name = "item") 
テキストノード(value = "Apple")
テキストノード(value = "\ n")
要素ノード(name = "item")
テキストノード(value = "banana")
 text node(value = "\ n")
 element node(name = "item")
 text node(value = "pepper") 
テキストノード(value = "\ n")

XPathの場合:

  • /はルートノードを選択します
  • /produceは、名前が"produce"である場合、ルートノードの子要素を選択します(これはdocument要素と呼ばれます。文書自体を表します。)要素とルートノードはしばしば混同されますが、同じものではありません。)
  • /produce/node()は、/produce/(つまり、7つのすべての子)の下の任意のタイプの子ノードを選択します
  • /produce/text()は、4つ(!)の空白のみのテキストノードを選択します
  • /produce/item[1]は、"item"という名前の最初の子要素を選択します
  • /produce/item[1]/text()は、all子テキストノードを選択します(この場合、「Apple」は1つだけです)

等々。

だから、あなたの質問

  • "プロデュース中のすべてのアイテムのテキストを選択"/produce/item/text()(3つのノードが選択されました)
  • "すべての部門のすべてのマネージャーノードを選択"//department/manager(1つのノードが選択されました)

ノート

  • XPathのデフォルトaxischild軸です。別の軸名に接頭辞を付けることにより、軸を変更できます。例://item/ancestor::produce
  • 要素ノードにはテキスト値があります。要素ノードを評価すると、そのテキストコンテンツが返されます。この例の場合、/produce/item[1]/text()string(/produce/item[1])は同じになります。
  • この回答 も参照してください。ここで、XPath式の個々の部分をグラフィカルに示しています。
121
Tomalak

生産中のすべてのアイテムのテキストを選択します。

//produce/item/text()

すべての部門のすべてのマネージャーノードを選択します。

//department/*
1
Danil Speransky