Я использую пакет гибкости 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}']