Система.XML.язык XPath.XPathException: выражение должно вычисляться до Node-set при выполнении SelectSingleNode ("//(исполнитель / автор)")


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

Я выполняю

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

И я получаю

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

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

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

2 ответа:

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

    "//artist|//author"

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

Обновление:

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

3.3 узел-множеств

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

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

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

В частности, вы не можете сказать "рекурсивно искать (что-то под названием автор или что-то под названием исполнитель)", потому что "что-то под названием автор" не оценивает результат xpath-запроса (набор узлов).

  1. //artist|//author работает с XPATH 1.0 и 2.0
  2. //(artist|author) работает с XPATH 2.0

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