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