Система.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 ответа:
Насколько мне известно, вы можете использовать '|' только на верхнем уровне запроса XPath, поэтому попробуйте запрос
"//artist|//author"
Пока способ выполнения рекурсивного поиска ( / / ) не очень быстрый, поэтому убедитесь, что ваш документ dom мал.
Обновление:
Я посмотрел его в спецификации :
3.3 узел-множеств
Путь расположения может быть использован в качестве выражение. Выражение возвращает значение набор узлов, выбранных путем.
Оператор | вычисляет объединение его операнды, которые должны быть наборами узлов.
Это означает, что все, что вы пишете слева и справа от"|", должно быть использовано в качестве запроса xpath само по себе, " | " тогда просто создает объединение из него.
В частности, вы не можете сказать "рекурсивно искать (что-то под названием автор или что-то под названием исполнитель)", потому что "что-то под названием автор" не оценивает результат xpath-запроса (набор узлов).