Проблема XPath, получение «выражения должны вычисляться для набора узлов». ошибка - PullRequest
1 голос
/ 13 августа 2010

У меня проблемы с получением одного узла по его явному 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 ]

0 голосов
/ 07 января 2011

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

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

Надеюсь, что помогает,
J

0 голосов
/ 15 августа 2010

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

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