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 (набор узлов).
//artist|//author
работает с XPATH 1.0 и 2.0//(artist|author)
работает с XPATH 2.0
Microsoft - ленивая корпорация. Их фреймворк поддерживает только XPATH 1.0