目前的文件说:
定义是否必须在结束时或直接在文档中关闭非闭合节点。 将此设置为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);
谢谢!
答案 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;
这将为您提供预期的格式。
否则,库将检查未关闭的任何标记,并根据您的代码执行流程将它们关闭在任何合适的位置。