Каков правильный XPath для «всех узлов ровно на один уровень ниже базового узла?» - PullRequest
5 голосов
/ 27 марта 2009

Предполагая, что я не знаю имени моего базового узла или его дочерних элементов, каков синтаксис XPath для "всех узлов точно на один уровень ниже базового узла?"

Поскольку pattern является XmlNode, у меня есть следующий код:

XmlNodeList kvpsList = pattern.SelectNodes(@"//");

Что выглядит правильно для меня, но я получаю следующее исключение:

   System.Xml.XPath.XPathException: Expression must evaluate to a node-set.

Какой правильный синтаксис?

Ответы [ 2 ]

8 голосов
/ 27 марта 2009

Путь, который вы ищете,

/*/*

// не является значимым выражением XPath, поскольку оно является оператором. Если вы напишите что-то вроде //element, это будет соответствовать каждому элементу с именем element в любом месте XML-документа, независимо от того, насколько глубоко он находится в иерархии.

/*/* говорит "сопоставить каждый узел, который имеет два уровня глубины в иерархии".

7 голосов
/ 28 марта 2009

Два текущих ответа неверны:

/*/*

не выбирает все узлы, которые являются дочерними для верхнего узла . Он не выбирает текстовые узлы, инструкции обработки или комментарии, которые являются дочерними элементами верхнего элемента.

Одно выражение XPath, которое выбирает все узлы, являющиеся дочерними элементами верхнего элемента:

/*/node()

// не является синтаксически правильным выражением XPath; в соответствии с XPath Spec :

// это сокращение от / Потомок или само-:: узел () / * * тысяча двадцать пять

Отметьте начало незавершенного шага локации в самом конце расширенной аббревиатуры. Если к нему ничего не добавлено, все выражение XPath, содержащее аббревиатуру, заканчивается и, следовательно, синтаксически неверно.

Еще одно примечание состоит в том, что сокращение // не обязательно при указании выбора всех узлов, которые являются дочерними элементами верхнего элемента. Если вы хотите выбрать все узлы в документе XML, которые нисходят из верхнего элемента, то выберите одно выражение XPath:

/*//node()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...