HTML Agility包刪除break標記關閉

asp.net html-agility-pack vb.net

我正在使用HTML敏捷包創建HTML文檔。我加載一個模板文件,然後將內容添加到它。所有這一切工作,但當我查看輸出文件已經刪除關閉標籤從我<br/>標籤看起來像這樣<br> 。是什麼造成的?

Dim doc As New HtmlDocument()
doc.Load(Server.MapPath("Template.htm"))

Dim title As HtmlNode = doc.DocumentNode.SelectSingleNode("//title")

title.InnerHtml = title.InnerHtml & "CEU Classes"
Dim topContent As HtmlAgilityPack.HtmlNode = doc.GetElementbyId("topContent")

topContent.InnerHtml = html.ToString
doc.OptionWriteEmptyNodes = True
doc.Save(outputFileName, Encoding.UTF8)

更多信息:

在我添加doc.OptionWriteEmptyNodes = True之後,它正在刪除我關閉的圖像標籤,它正在這樣做。

更新

這是我現在的代碼,它刪除了關閉的BR標記

Dim html As String = "Words<br/>more words"
Dim doc As New HtmlDocument()
Dim title As HtmlNode
Dim topContent As HtmlNode

HtmlNode.ElementsFlags("br") = HtmlElementFlag.Empty
doc.Load(Server.MapPath("Template.htm"))

Title = doc.DocumentNode.SelectSingleNode("//title")
title.InnerHtml = title.InnerHtml & "CEU Classes"

topContent = doc.GetElementbyId("topContent")
topContent.InnerHtml = html.ToString

doc.OptionWriteEmptyNodes = True
doc.Save(outputFileName, Encoding.UTF8)

更新2

我最後只是在我的模板文件中讀取標準字符串,然後像這樣加載html

Dim TemplateHTML As String = File.ReadAllText(Server.MapPath("Template.htm"))

TemplateHTML = TemplateHTML.Insert(TemplateHTML.IndexOf("<div id=""topContent"">") + "<div id=""topContent"">".Length, _
                                   html.ToString)

doc.LoadHtml(TemplateHTML)

一般承認的答案

這是因為Html Agility Pack以特殊方式處理BR。它仍然支持舊的(但現在在Web上存在)HTML 3.2語法,其中BR可以在沒有結束標記的情況下聲明(瀏覽器仍然可以優雅地處理它......)。

要更改此默認行為,您需要修改HtmlNode.ElementFlags屬性,如下所示:

Dim doc As New HtmlDocument()
HtmlNode.ElementsFlags("br") = HtmlElementFlag.Empty
doc.LoadHtml("<test>before<br/>after</test>")
doc.OptionWriteEmptyNodes = True   
doc.Save(Console.Out)

將顯示:

<test>before<br />after</test>

熱門答案

根據@Simon Mourier,以下C#代碼適用於1.4版本

var doc = new HtmlDocument();
HtmlNode.ElementsFlags["br"] = HtmlElementFlag.Empty;
doc.OptionWriteEmptyNodes = true;
doc.LoadHtml("Lorem ipsum dolor sit<br/>Lorem ipsum dolor sit");

var postParsed = doc.DocumentNode.WriteTo();

postParsed具有以下字符串值

"Lorem ipsum dolor sit<br />Lorem ipsum dolor sit"



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