我有以下 c# 方法,该方法通过 xpath 对从 refNode 可访问的所有节点执行一些操作
void foo(XmlNode refNode, string xpath)
{
XmlNodeList list=refNode.SelectNodes(xpath);
//perform operation on each element of the list
}
我得到的输入 xml 之一是:
<A>
<B>***
<C>
<B>One</B>
</C>
<B>
<B>Two</B>
</B>
</B>
<B>...</B>
<B>...</B>
</A>
我需要选择一个 refNode <B>
(标记***
)并将其传递给 foo() 并使用一个 xpath 选择<B>
refNode 的所有后代节点,但不嵌套在任何其他<B>
节点内
例如,在给定的输入中,结果应包含:
1. <B>One</B>
2. <B><B>Two</B></B>
我试过 .//B 给我 3 个结果和 .//B[not(ancesotr::B)] 返回 0 个结果。
我应该使用什么 Xpath 来获得所需的结果?
编辑
我可以更改方法 foo,但不能更改它的签名。此方法是库的一部分,并且被少数用户使用。上面给出的输入只是一个特定的实例,用户也可以将节点 A 作为 refnode 发送并请求所有 C 节点。
Edit2
@Dimitre Novatchev 的解决方案适用于我,如果我可以在不更改其签名的情况下获得 foo 内的 refnode 的 xpath,或者如果有某种方法可以指定this
节点,即应用 xpath 的节点。
.//B[not(ancesotr::B) or ancesotr::B[1]=**this**]