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>
もちろん、より多くの部門とより多くのマネージャーがいますが、これは単なるコードのスニペットでした。
どんな助けも大歓迎です!
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つのノードが選択されました)ノート
child
軸です。別の軸名に接頭辞を付けることにより、軸を変更できます。例://item/ancestor::produce
/produce/item[1]/text()
とstring(/produce/item[1])
は同じになります。生産中のすべてのアイテムのテキストを選択します。
//produce/item/text()
すべての部門のすべてのマネージャーノードを選択します。
//department/*