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

c# html-agility-pack

目前的文件说:

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

对不起,我不得不承认我不明白这一段。具体到底“什么? “文档中”的含义究竟是什么意思?最后一句之前的短语听起来很不祥。如果该选项设置为true并且html格式正确,这仍然会影响文档吗?

我查看了源代码,但我不明白发生了什么 - 代码对未设置为true的属性做出反应。请参阅HtmlNode.cs ,并搜索OptionAutoCloseOnEnd - 第1707行。我还在第1113行和第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);

谢谢!

一般承认的答案

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

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);

热门答案

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

 doc.OptionAutoCloseOnEnd = false;

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

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



Related

许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow