33

これは、実装を参照せずに標準の XPath を使用するだけで回答できるはずですが、参照用に .Net (System.Xml 名前空間) で XML DOM オブジェクトを使用しています。

XML ドキュメントの奥深くから関数に渡されたノードがあり、それらのノードへの介在パスに関係なく、特定の名前を持つこのノードのすべての子孫要素を選択したいと考えています。私が行っている呼び出しは次のようになります。

node.SelectNodes("some XPath here");

私が扱っているノードは次のようになります。

...
<food>
  <tart>
    <apple color="yellow"/>
  </tart>
  <pie>
    <crust quality="flaky"/>
    <filling>
      <apple color="red"/>
    </filling>
  </pie>
  <apple color="green"/>
</food>
...

私が欲しいのは、すべての「リンゴ」ノード、つまり 3 つの結果のリストです。私はいくつかの異なることを試しましたが、どれも私が望むものを得ることができません。

node.SelectNodes("apple");

これにより、青リンゴという 1 つの結果が得られます。

node.SelectNodes("*/apple");

これにより、1 つの結果、黄色いリンゴが得られます。

node.SelectNodes("//apple");

これにより、何百もの結果が得られ、ドキュメント内のすべてのリンゴ ノード、または少なくともドキュメントのルートの直接の子であるすべてのリンゴ ノードのように見えます。

現在のノードの下の深さに関係なく、現在のノードの下にあるすべてのリンゴ ノードを提供する XPath を作成するにはどうすればよいですか? 具体的には、上記の例に基づいて、赤、緑、黄色のリンゴの 3 つの結果が得られるはずです。

4

1 に答える 1

47

試してみてください.//apple。これにより、現在のノードの子孫であるすべてのappleノードが一覧表示されます。このトピックをよりよく理解するには、XPath軸がどのように機能するかを学ぶ必要があります。descendant::appleたとえば、と書くこともできます。

于 2013-02-25T22:21:51.717 に答える