3

我正在使用 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));

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

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

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

是否可以直接从 Visual Studio 加载一个 ASPX 文件(我正在构建一个加载项)或者这是否包含 XML 错误,我是否必须加载输出 HTML 流(在开始时没有页面声明文件)?

4

1 回答 1

5

问题在于SelectNodes()

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

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

根据 XPath W3C 规范:

///descendant-or-self::node()/”的缩写

因此,上述扩展为:

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

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

可能你想要

//*[@id='{0}']
于 2010-07-04T15:29:43.917 回答