htmllagilitypack:有人能解释一下设置HtmlDocument OptionAutoCloseOnEnd为

本文关键字:一下 设置 HtmlDocument OptionAutoCloseOnEnd 能解释 htmllagilitypack | 更新日期: 2023-09-27 18:15:58

当前文档中说:

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

对不起,我得承认我不明白这段话。具体来说是在什么结尾?"在文件中"到底是什么意思?最后一个之前的短语听起来很不吉利。如果该选项设置为true,并且html格式正确,这是否仍然会影响文档?

我查看了源代码,但我不明白发生了什么-代码对属性未设置为true作出反应。查看HtmlNode.cs,并搜索OptionAutoCloseOnEnd - line 1707。我还在HtmlWeb.cs中的1113和1154行发现了一些奇怪的代码。糟糕的是,源代码浏览器不显示行号,而是在页面中搜索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);

谢谢!

htmllagilitypack:有人能解释一下设置HtmlDocument OptionAutoCloseOnEnd为

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

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

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

 doc.OptionAutoCloseOnEnd = false;

它会给你期望的格式。

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