2013-02-25 5 views
17

これは、実装の参照なしに標準のXPathを使用するだけで答えることができるはずですが、参考のために.NET(System.Xml名前空間) 。XPathで指定された名前のすべての要素を選択する

私は、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つの結果。 私は2つの異なることを試しましたが、どれも私が望むものを得ることはできません。

これは私に1つの結果、緑色のリンゴを与えます。

node.SelectNodes("*/apple"); 

これは私に1つの結果、黄色いリンゴを与えます。

node.SelectNodes("//apple"); 

これは、私に結果の数百を与える文書内のすべてのリンゴのノード、またはドキュメントのルートの直接の子である、少なくとも多分すべてのリンゴのノードのように見えます。

現在のノードの下にどれだけ深いところがあるかにかかわらず、現在のノードの下にすべてのリンゴノードを与えるXPathを作成するにはどうすればよいですか?具体的には、上記の例に基づいて、赤、緑、黄色のリンゴの3つの結果が得られるはずです。

答えて

25

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

+0

完璧な、それはまさに私が探していたものです。私は1時間グーグルでそれを見つけることができませんでした。私は文法を正しく理解していることを理解するために、二重スラッシュは深度に関係なく(私の質問で試したように)私にすべてのリンゴノードを与え、それらの前のドットは選択を現在のノードの子孫に制限します。あれは正しいですか? –

+0

はい、そうです。私はあなたのポストをいくつか追加するために自分の投稿を編集しました。 – nwellnhof

+0

答えを編集して、XPath軸がどのように機能するのかを知っておく必要があります - 私は同意します。あなたは私がチェックアウトすべき良い資源の提案をしていますか? –

関連する問題