System.Xml.XPath.XPathException: выражение должно вычислять набор узлов при выполнении SelectSingleNode ("// (artist | author)") - PullRequest
4 голосов
/ 10 марта 2009

Может кто-нибудь объяснить мне, почему это не работает?

Я выполняю

XmlNode xmlNode = xmlDocument.SelectSingleNode("//(artist|author)");

и я получаю

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

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

XmlNode xmlNode = xmlDocument.SelectSingleNode("//artist");

Ответы [ 2 ]

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

Насколько мне известно, вы можете использовать '|' просто на верхнем уровне XPath Query, поэтому попробуйте запрос

    "//artist|//author"

Пока рекурсивный поиск (//) не очень быстрый, поэтому убедитесь, что ваш документ DOM небольшой.

Обновление:

Я посмотрел в спецификации :

3.3 Узлы-наборы

Путь местоположения может использоваться как выражение. Выражение возвращает набор узлов, выбранных по пути.

| Оператор вычисляет объединение его операнды, которые должны быть наборами узлов.

Это означает, что вы пишете слева и справа от "|" должен использоваться как запрос xpath сам по себе, "|" затем просто создает союз из него.

В частности, вы не можете сказать «искать рекурсивно (что называется автор ИЛИ что называется художник)», потому что «что называется автор» не оценивается как результат запроса xpath (набор узлов).

0 голосов
/ 02 декабря 2009
  1. //artist|//author работает с XPATH 1.0 и 2.0
  2. //(artist|author) работает с XPATH 2.0

Microsoft - ленивая корпорация. Их фреймворк поддерживает только XPATH 1.0

...