xpathを介して、refNodeから到達可能なすべてのノードで何らかの操作を実行する次のc#メソッドがあります
void foo(XmlNode refNode, string xpath)
{
XmlNodeList list=refNode.SelectNodes(xpath);
//perform operation on each element of the list
}
私が取得している入力xmlの1つは次のとおりです。
<A>
<B>***
<C>
<B>One</B>
</C>
<B>
<B>Two</B>
</B>
</B>
<B>...</B>
<B>...</B>
</A>
ここで、refNode <B>
(マーク付き) を選択し、refNode のすべての子孫ノードを選択するが、他のノード内にネストされていない***
xpath を使用して foo() に渡す必要があります。<B>
<B>
たとえば、指定された入力では、結果に次のものが含まれている必要があります。
1. <B>One</B>
2. <B><B>Two</B></B>
3 つの結果を返す .//B と 0 の結果を返す .//B[not(ancesotr::B)] を試しました。
目的の結果を得るには、どの Xpath を使用すればよいですか?
編集
メソッド foo は変更できますが、そのシグネチャは変更できません。このメソッドはライブラリの一部であり、少数のユーザーによって使用されています。上記の入力は特定のインスタンスにすぎません。ユーザーはノード A を refnode として送信し、すべての C ノードを要求することもできます。
Edit2
@Dimitre Novatchevのソリューションは、署名を変更せずにfoo内のrefnodeのxpathを取得できる場合、またはthis
ノード、つまりxpathが適用されているノードを指定する方法がある場合に機能します。
.//B[not(ancesotr::B) or ancesotr::B[1]=**this**]