【问题标题】:HtmlAgilityPack: Could someone please explain exactly what is the effect of setting the HtmlDocument OptionAutoCloseOnEnd to true?HtmlAgilityPack:有人可以准确解释将 HtmlDocument OptionAutoCloseOnEnd 设置为 true 的效果吗?
【发布时间】:2016-11-03 01:15:11
【问题描述】:

当前文档说:

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

对不起,我不得不承认我看不懂这一段。具体“结束”是什么? “在文件中”究竟是什么意思?最后一句之前的那句话听起来很不祥。如果该选项设置为 true 并且 html 格式正确,这仍然会影响文档吗?

我查看了源代码,但我不明白发生了什么 - 代码对未设置为 true 的属性做出反应。请参阅HtmlNode.cs,并搜索 OptionAutoCloseOnEnd - 第 1707 行。我还在HtmlWeb.cs 第 1113 和 1154 行发现了一些时髦的代码。太糟糕了,源代码浏览器不显示行号,但在页面中搜索 OptionAutoCloseOnEnd。

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

我正在使用 HtmlAgilityPack 修复一些错误的 html 并将页面内容导出到 xml。

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

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

谢谢!

【问题讨论】:

    标签: c# html-agility-pack


    【解决方案1】:

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

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

    将输出这个(未关闭的&lt;y&gt;在父&lt;x&gt;关闭之前关闭)

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

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

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

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

    这个功能(我承认可能没用)在过去的某个地方被破坏了,我不知道为什么。

    注意&lt;p&gt; 标签大小写是特殊的,因为它默认由自定义 HtmlElementFlag 管理。这是它在 HtmlNode.cs 中的声明方式:

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

    【讨论】:

    • 感谢您的解释。当 OptionAutoCloseOnEnd = false 时,未关闭的 p 是在找到另一个同级 p 时关闭还是仅在其父级关闭时关闭?您是否在某些标签的代码中做出了这种区分?另外,当找到没有开始标签的结束标签时会发生什么?它被丢弃了吗?
    • 是的,没有相应的开始标签的结束标签将被丢弃(可能带有错误文件)。标签仅针对定义的 ElementFlags(在 HtmlNode.cs 中)以特殊方式处理。
    【解决方案2】:

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

     doc.OptionAutoCloseOnEnd = false;
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 2022-01-22
      • 2020-11-12
      • 1970-01-01
      • 2012-05-29
      相关资源
      最近更新 更多