Исключение при запросе HTML для ID с помощью пакета Agility Pack

html html-agility-pack parsing xpath

Вопрос

Я использую пакет гибкости HTML для анализа файла ASPX внутри Visual Studio.

Я ищу элемент с указанным атрибутом ID.

Код, который я использую:

var html = new HtmlAgilityPack.HtmlDocument();
html.LoadHtml(docText);
if (html.DocumentNode != null)
{
     try
     {
          var tagsWithId = html.DocumentNode.SelectNodes(string.Format("//[@id='{0}']", selector.Id));

Однако, когда я запускаю этот код, он выдает исключение «Выражение должно оцениваться с помощью набора узлов».

Может ли кто-нибудь сказать мне, почему этот « должен » оценивать узел? Почему он не может просто не возвращать узлы (следующая строка вызывает тегиWithId.Count)? Конечно, HtmlNodeCollection, возвращаемый методом SelectNodes, может содержать 0 узлов?

Или это ошибка из-за неправильного выражения Xpath? [Идентификатор селектора, который я тестирую, определенно существует в файле как <div id = "thisId">.]

Возможно ли даже загрузить ASPX-файл прямо из Visual Studio (я создаю надстройку) или это будет содержать ошибки XML, и вместо этого мне придется загружать выходной поток HTML ( т. Е. Без объявления страницы в начале файла и т . д.)?

Принятый ответ

Проблема заключается в аргументе SelectNodes() :

//[@id='{0}']

(после выполнения замены) не является сибактически законным выражением XPath . Поэтому проблема заключается не в том, что выражение XPath «не возвращает узлов» - проблема в том, что она синтаксически незаконна.

Согласно спецификации XPath W3C:

// не хватает для /descendant-or-self::node()/ "

Таким образом, вышесказанное расширяется до:

/descendant-or-self::node()/[@id='{0}']

Обратите внимание, что последний шаг местоположения не имеет узла-теста и начинается с предиката. Это запрещено в соответствии с правилами синтаксиса XPath.

Возможно, вы хотите :

//*[@id='{0}']


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему