Как использовать XPath-функции, такие как exists() в С#?

Я хочу прочитать некоторые узлы из объекта XmlDocument, используя метод SelectNodes и класс XPathNavigator.

Но С# не может оценить этот (проверенный с помощью XMLSpy) XPath-Expressen:

//LogicUnit[exists(Level[@val = 'R'])]/LogicLines[exists(LogicLine/DATAVIEW_SRC)]

Среда выполнения выдает XPathException "Требуется диспетчер пространства имен или XsltContext. Этот запрос имеет префикс, переменную или определяемую пользователем функцию."

Я не понимаю это исключение, потому что мой XML-документ не использует никаких пространств имен, а также нет XSLT-документа. Это исключение всегда появляется, если я использую любую XPATH-функцию.


person DiableNoir    schedule 20.10.2011    source источник


Ответы (3)


Причина в том, что он не может использовать функции без менеджера пространства имен, однако вам не нужно использовать функции, и ваш код использует эту функцию неправильным образом. вам не нужна функция exists(), чтобы увидеть, существует ли что-то, из того, что я вижу, вы используете

//LogicUnit[exists(Level[@val = 'R'])]

где вы имеете в виду

//LogicUnit[Level[@val = 'R']]
person Woody    schedule 20.10.2011
comment
Спасибо, но выражение XPath-Expression было просто примером. Существует множество XPath-выражений, которые необходимо оценить, и некоторые из них также используют такие функции. :-( ...Добавление Namespace-Manager просто приводит к другому исключению: XsltContext необходим для этого запроса из-за неизвестной функции. - person DiableNoir; 20.10.2011

Функция XPath exists() определена в XPath 2.0, но механизм Microsoft XPath по умолчанию в .NET поддерживает только XPath 1.0. Если вам нужен движок XPath 2.0, работающий под .NET, попробуйте Saxon или XQSharp.

person Michael Kay    schedule 20.10.2011

Используйте //LogicUnit[count(Level[@val = 'R']) > 0].

person riezebosch    schedule 20.10.2011
comment
часть count() › 1 здесь бессмысленна, если вы проверяете, больше ли число 0, это то же самое, что и проверка его существования, так что //LogicUnit[Level[@val='R']] производит такой же результат. - person Woody; 23.10.2011