24

我正在使用 HtmlAgilityPack。我使用以下字符串创建了一个 HtmlDocument 和 LoadHtml:

<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One</option><option value="2">Two</option></select>

这会做一些意想不到的事情。首先,它给出了两个解析器错误,EndTagNotRequired。其次,选择节点有 4 个子节点 - 两个用于选项标签,另外两个用于选项标签的内部文本。最后,OuterHtml 是这样的:

<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One<option value="2">Two</select>

所以基本上我决定放弃选项的结束标签。让我们暂时搁置这样做是否适当和可取。我正在使用 HtmlAgilityPack 来测试 HTML 生成代码,所以我不希望它为我做出任何决定或给出任何错误,除非 HTML 确实格式错误。有什么方法可以让它表现出我想要的样子吗?我尝试为 HtmlDocument 设置一些选项,特别是:

 doc.OptionAutoCloseOnEnd = false;
 doc.OptionCheckSyntax = false;
 doc.OptionFixNestedTags = false;

这是行不通的。如果 HtmlAgilityPack 不能做我想要的,你能推荐一些可以的东西吗?

4

2 回答 2

32

在 HAP 主页的讨论中报告了完全相同的错误,但看起来在几年内没有对项目进行有意义的修复。不鼓励。

对源代码的快速浏览表明,可以通过注释掉 HtmlNode.cs 的第 92 行来修复该错误:

// they sometimes contain, and sometimes they don 't...
ElementsFlags.Add("option", HtmlElementFlag.Empty);

(实际上不,它们总是包含标签文本,尽管空白字符串也是有效的文本。粗心的作者可能会省略结束标签,但任何元素都是如此。)

添加

一个等效的解决方案是HtmlNode.ElementsFlags.Remove("option");在任何使用 liberary 之前调用(无需修改 liberary 源代码)

于 2008-11-16T02:22:46.617 回答
5

似乎有一些理由不将 Option 标记解析为“通用”标记,以符合 XHTML,但这可能是一个真正的痛苦。

我的建议是做一个完整的字符串替换并将所有“选项”标签更改为“my_option”标签,这样你:

  1. 不必修改库的来源(以后可以升级)。
  2. 可以像往常一样解析。

HtmlAgilityPack 论坛上的原始帖子可以在以下位置找到: http ://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=14982

于 2010-11-05T14:30:58.777 回答