У меня есть следующий метод С#, который выполняет некоторую операцию на всех узлах, доступных из refNode, через xpath
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 работает для меня, если я могу получить xpath refnode внутри foo без изменения его подписи или если есть какой-то способ указать this
node, то есть узел, на котором xpath находится применяемый.
.//B[not(ancesotr::B) or ancesotr::B[1]=**this**]