OptionWriteEmptyNodes使用HtmlAgilityPack中斷XML聲明

c# end-tag html-agility-pack non-well-formed xml-declaration

這是我有的超級簡單代碼:

HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.OptionWriteEmptyNodes = true;
htmlDoc.Load("sourcefilepath");
htmlDoc.Save("destfilepath", Encoding.UTF8);

輸入:

HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.OptionWriteEmptyNodes = true;
htmlDoc.Load("sourcefilepath");
htmlDoc.Save("destfilepath", Encoding.UTF8);

輸出:

HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.OptionWriteEmptyNodes = true;
htmlDoc.Load("sourcefilepath");
htmlDoc.Save("destfilepath", Encoding.UTF8);

您可以看到第一行中存在錯誤:/>而不是?>如果我將OptionWriteEmptyNodes設置為true值,則會發生這種情況。它已設置為true,因為否則將不會關閉元/鏈接標記(以及文檔正文中的其他標記)。

有誰知道如何解決這個問題?

一般承認的答案

好像是個bug。您應該將其報告給http://htmlagilitypack.codeplex.com

不過,你可以像這樣解決這個bug:

HtmlNode.ElementsFlags.Remove("meta");
HtmlNode.ElementsFlags.Remove("link");
HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.Load("sourcefilepath");
htmlDoc.Save("destfilepath", Encoding.UTF8);

只需刪除指示Html Agility Pack不會自動關閉它們的metalink標記中的標記,並且不要將OptionWriteEmptyNodes設置為true

它會產生這個(注意這略有不同):

HtmlNode.ElementsFlags.Remove("meta");
HtmlNode.ElementsFlags.Remove("link");
HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.Load("sourcefilepath");
htmlDoc.Save("destfilepath", Encoding.UTF8);

熱門答案

管理另一種解決此問題的方法。在我的情況下,這比上面的情況略好。基本上我們正在替換DocumentNode的第一個子節點,即xml聲明。(請注意,輸入必須包含xml聲明,在我的情況下它是100%)

HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.OptionWriteEmptyNodes = true;
htmlDoc.Load("sourcepath");

var newNodeStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
var newNode = HtmlNode.CreateNode(newNodeStr);

htmlDoc.DocumentNode.ReplaceChild(newNode, htmlDoc.DocumentNode.FirstChild);


htmlDoc.Save("destpath", Encoding.UTF8);

請注意,Simon的解決方法也適用,所以請選擇最適合您場景的解決方案。




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因