HtmlAgilityPack删除选项结束标记

时间:2008-11-16 01:45:53

标签: html parsing html-agility-pack

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

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

这会做一些意想不到的事情。首先,它给出了两个解析器错误,EndTagNotRequired。其次,select节点有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不能做我想做的事,你能推荐一些可以吗?

2 个答案:

答案 0 :(得分:31)

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

快速浏览一下来源表明可以通过注释掉HtmlNode.cs的第92行来解决错误:

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

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

添加

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

答案 1 :(得分:5)

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

我的建议是进行整个字符串替换并将所有“选项”标记更改为“my_option”标记,就像这样:

  1. 不必修改库的来源(以后可以升级)。
  2. 可以像往常一样解析。
  3. HtmlAgilityPack论坛上的原始帖子可以在以下位置找到: http://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=14982