使用HTML Agility Pack查询HTML ID时出现异常

时间:2010-07-04 12:40:52

标签: 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));

但是,当我运行此代码时,它会抛出异常“Expression必须计算到节点集”。

有谁能告诉我为什么这个“必须”评估一个节点集?为什么它不能简单地返回没有节点(下一行调用tagsWithId.Count)?当然,SelectNodes方法返回的HtmlNodeCollection可以包含0个节点吗?

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

甚至可以直接从Visual Studio加载ASPX文件(我正在构建一个加载项),或者它是否包含XML错误,我将不得不加载输出HTML流( ie < / em>在文件开头没有页面声明, etc 。)?

1 个答案:

答案 0 :(得分:4)

问题在于SelectNodes()的参数:

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

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

根据XPath W3C规范:

///descendant-or-self::node()/

的缩写

因此,上述内容扩展为:

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

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

可能你想要

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