0

次の XML を例にとります。

<root>
  <lines>
    <line>
      <number>1</number>
    </line>
    <line>
      <number>2</number>
    </line>
  </lines>
</root>

XmlNodeList nodeList = doc.SelectNodes("//lines/line");
foreach(XmlNode node in nodeList)
{
    int index = node.SelectSingleNode("//number");
}

上記のコードは、両方の反復で index = 1 になります。

foreach(XmlNode node in nodeList)
{
    int index = node.SelectSingleNode("number");
}

上記のコードは、それぞれ 1,2 になります。// が xpath の最初の出現を見つけることは知っていますが、最初の出現はノード自体に関連する必要があるように感じます。子ノードからノードを選択する場合でも、動作はルートから最初のオカレンスを見つけるように見えます。これはマイクロソフトがこれを機能させることを意図した方法ですか、それともバグですか。

4

1 に答える 1

2

ええ、ありがとうございますが、スラッシュを削除するだけで、2 番目の例と同様に機能しました。

numberの直接の子要素であるため、スラッシュの削除のみが機能しますline。階層のさらに下にある場合:

<root>
  <lines>
    <line>
      <other>
        <number>1</number>
      </other>
    </line>
  </lines>
</root>

を使用する必要があります.//number

ノード内のノードを検索している場合、 // ドキュメント全体に戻るのは混乱していると思います。

これが、XPath 構文の設計方法です。//XPath 式の先頭にある は、評価コンテキストがドキュメント ノード (XML ドキュメントの最も外側のノード) であることを意味します。.//パス式のコンテキストが現在のコンテキスト ノードであることを意味します。

考えてみれば、ドキュメント全体から任意のコンテキストで選択できる方法があると、実際に便利です。

これはマイクロソフトがこれを機能させることを意図した方法ですか、それともバグですか。

Microsoft は XPath 標準を実装しています。そうです、これは W3C が意図した XPath ライブラリの動作方法であり、バグではありません。

于 2016-02-19T07:48:31.933 に答える