Исключение при запросе HTML для идентификатора с использованием HTML Agility Pack - PullRequest
2 голосов
/ 04 июля 2010

Я использую пакет Agility для 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));

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

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

Или это ошибка из-за искаженного выражения Xpath?[Идентификатор селектора, с которым я проверяю это, определенно существует в файле как.]

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

1 Ответ

4 голосов
/ 04 июля 2010

Проблема в аргументе SelectNodes():

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

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

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

"// короткийдля /descendant-or-self::node()/ "

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

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

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

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

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