使用HTML Agility Pack查询HTML的ID时发生异常

awj*_*awj 3 html xpath parsing html-agility-pack

我正在使用HTML Agility包来解析Visual Studio中的ASPX文件。

我正在搜索具有指定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));
Run Code Online (Sandbox Code Playgroud)

但是,当我运行此代码时,它将引发异常“表达式必须计算为节点集”。

谁能告诉我为什么这个“ 必须 ”评估为一个节点集?为什么它不能简单地不返回任何节点(下一行调用tagWithId.Count)?确定由SelectNodes方法返回的HtmlNodeCollection可以包含0个节点吗?

还是由于Xpath表达式格式错误导致的错误?[我正在测试的选择器ID确实以<div id =“ thisId”>存在于文件中。]

甚至有可能直接从Visual Studio加载ASPX文件(我正在构建外接程序),还是会包含XML错误,而我将不得不加载输出HTML流(,在开始时没有页面声明)文件)。

Dim*_*hev 5

问题出在SelectNodes()

//[@id='{0}']
Run Code Online (Sandbox Code Playgroud)

(执行替换之后)不是语法上合法的XPath表达式。因此,问题不在于XPath表达式“不返回任何节点”-问题在于它在语法上是非法的。

根据XPath W3C规范:

//是短期的/descendant-or-self::node()/

因此,以上内容扩展为:

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

注意,最后一个定位步骤没有节点测试,并且从谓词开始。根据XPath的语法规则,这是非法的。

可能您想要

//*[@id='{0}']
Run Code Online (Sandbox Code Playgroud)