Проблема XPath, получение "выражения должны вычисляться как набор узлов". ошибка

У меня проблемы с извлечением одного узла по его явному XPath, который я уже нашел другими способами. У меня есть узел, и я могу получить его XPath, но когда я пытаюсь извлечь этот же узел снова на этот раз через узел. XPath выдает ошибку "выражение должно вычисляться для набора узлов". Разве это не должно работать? Я использую HtmlAgilityPack в C# btw для HtmlDocument.

HtmlDocument doc = new HtmlDocument();
doc.Load(@"..\..\test1.htm");
HtmlNode node = doc.DocumentNode.SelectSingleNode("(//node()[@id='something')])[first()]");
HtmlNode same = doc.DocumentNode.SelectSingleNode(node.XPath);

Кстати: это значение узла.XPath:

"/html[1]/body[1]/table[1]/tr[1]/td[1]/div[1]/div[1]/div[2]/table[1]/tr[1]/td[1]/div[1]/div[1]/table[1]/tr[1]/td[1]/div[1]/div[1]/div[4]/div[2]/div[1]/div[1]/div[4]/#text[2]"

2 ответа

Решение

Я смог заставить его работать, заменив #text на функцию text(). Я не уверен, почему он просто не генерировал XPath таким образом.

HtmlNode same = doc.DocumentNode.SelectSingleNode(node.XPath.Replace("#text","text()");

Ваш XPath оканчивается на "#text[2]", что означает "второй атрибут" текст "". Атрибуты не являются узлами, это метаданные узла.
Это обычная проблема, с которой я столкнулся в XPath: получение значения атрибута, в то время как операция XPath обязательно должна извлечь узел.

Решение, которое я использовал для этого, состоит в том, чтобы обернуть мою выборку XPath чем-то, что обнаруживает и удаляет часть атрибута строки (через вызов метода myXPathString.LastIndexOf( "#")), а затем использует усеченную myXPathString для выборки узел и собрать желаемое значение атрибута в качестве второго шага.

Надеюсь, это поможет,
J

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