System.Xml.XPath.XPathException: выражение должно оцениваться как набор узлов при выполнении SelectSingleNode("//(artist|author)")

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

Я исполняю

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

и я получаю

System.Xml.XPath.XPathException: выражение должно вычисляться как набор узлов.

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

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

2 ответа

Решение

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

    "//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

Другие вопросы по тегам