HtmlAgilityPack删除选项结束标签

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 不能做我想要的事情,你能推荐一些可以做到的东西吗?


对于任何遇到此问题的人,请查看我的答案,网址为https://dev59.com/5HRA5IYBdhLWcg3w_C8w#12096383,其中提供了一种在不修改HAP源代码的情况下设置bobnce答案的方法。 - MaxPRafferty
2个回答

32

在HAP主页的讨论区报告了完全相同的错误,但似乎在几年内没有对该项目进行任何有意义的修复。不太令人鼓舞。

快速浏览源代码,暗示这个错误可能通过注释掉HtmlNode.cs的第92行来修复:

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

实际上,它们始终包含标签文本,尽管空字符串也是有效的文本。粗心的作者可能会省略结束标记,但这也适用于任何元素。

ADD

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


2
我在尝试获取选项的InnerText值时遇到了这个问题。我直接在我的代码中使用HtmlNode的公开静态哈希表应用了您的解决方案:HtmlNode.ElementsFlags.Remove("option"); - Jason Morse
嗨,Jason,你是如何在自己的代码中直接解决这个问题的?我在我的代码中尝试了HtmlNode.ElementsFlags.Remove("option"),但它并没有解决未关闭的img标签问题。你能详细说明一下吗?除非必须,否则我不想修改和重新编译源代码。非常感谢! - Ray
1
@ray247 我曾经在静态构造函数中尝试过这个 HtmlNode.ElementsFlags.Remove("option");,然后 EndTagNotRequired 错误消失了。 - user586399

5
似乎有些原因不将Option标签解析为“通用”标签以符合XHTML规范,但这可能会非常麻烦。我的建议是进行整个字符串替换,并将所有“option”标签更改为“my_option”标签,这样你就能够:1.无需修改库的源代码(并可以随后升级) 2.像通常一样解析。可以在HtmlAgilityPack论坛上找到原始帖子:http://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=14982

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接