HtmlAgilityPack:有人可以解释一下将HtmlDocument OptionAutoCloseOnEnd设置为true的确切效果是什么?

时间:2016-11-03 01:15:12

标签: c# html-agility-pack

目前的文件说:

  

定义是否必须在结束时或直接在文档中关闭非闭合节点。       将此设置为true实际上可以更改浏览器呈现页面的方式。默认为false。

抱歉,我不得不承认我不理解这一段。特别是#34;最后"什么?文件"中的"是什么?是什么意思?在最后一个之前的短语听起来不祥。如果该选项设置为true并且html格式正确,这仍然会影响文档吗?

我查看了源代码,但我不明白发生了什么 - 代码对该属性的反应没有设置为true。请参阅HtmlNode.cs,然后搜索OptionAutoCloseOnEnd - 第1707行。我还在第{11}行和第1154行的HtmlWeb.cs中找到了一些时髦的代码。太糟糕了,源代码浏览器没有显示行号但是搜索页面中的OptionAutoCloseOnEnd。

您能否举例说明此选项的作用?

我正在使用HtmlAgilityPack来修复一些糟糕的HTML并将页面内容导出到xml。

我遇到了一些格式错误的html重叠标签。这是片段:

<p>Blah bah
<P><STRONG>Some Text</STRONG><STRONG></p>
<UL>
<LI></STRONG>Item 1.</LI>
<LI>Item 2</LI>
<LI>Item 3</LI></UL>

请注意,第一个p标记未关闭,请注意重叠的STRONG标记。

如果我设置OptionAutoCloseOnEnd,这会得到某种程度的修复。我试图了解在文档结构中将此属性设置为true的确切效果是什么。

以下是我正在使用的C#代码:

HtmlDocument doc = new HtmlDocument();
doc.OptionOutputAsXml = true;
doc.OptionFixNestedTags = true;      
//  doc.OptionAutoCloseOnEnd = true;    
doc.LoadHtml(htmlText);

谢谢!

2 个答案:

答案 0 :(得分:3)

当前代码始终在父节点关闭之前关闭未关闭的节点。所以下面的代码

var doc = new HtmlDocument();
doc.LoadHtml("<x>hello<y>world</x>");
doc.Save(Console.Out);

将输出此内容(未关闭的<y>在父<x>关闭之前关闭)

<x>hello<y>world</y></x>

最初,该选项在设置时,意味着能够生成此选项(不适用于XML输出类型):

<x>hello<y>world</x></y>

在文档末尾设置结束<y>(这就是“结束”的含义)。请注意,在这种情况下,您仍然可以获得重叠元素。

这个功能(也许我无法承认)在过去的某个地方被打破了,我不知道为什么。

注意<p>标记大小写很特殊,因为它默认由自定义HtmlElementFlag控制。这就是它在HtmlNode.cs中声明的方式:

ElementsFlags.Add("p", HtmlElementFlag.Empty | HtmlElementFlag.Closed);

答案 1 :(得分:1)

使用HtmlAgilityPack的更好方法是在需要的地方以编程方式打开和关闭标记并设置:

 doc.OptionAutoCloseOnEnd = false;

这将为您提供预期的格式。

否则,库将检查未关闭的任何标记,并根据您的代码执行流程将它们关闭在任何合适的位置。