Il pacchetto HTML Agility rimuove la chiusura del tag di interruzione

asp.net html-agility-pack vb.net

Domanda

Sto creando un documento HTML usando il pacchetto agility HTML. Carico un file di modello quindi aggiungo il contenuto ad esso. Tutto questo funziona, ma quando osservo il file di output che ha rimosso il tag di chiusura dai miei <br/> tag per assomigliare a questo <br> . Che cosa sta causando questo?

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)

Ulteriori informazioni:

doc.OptionWriteEmptyNodes = True rimuovendo i miei tag immagine di chiusura, dopo aver aggiunto doc.OptionWriteEmptyNodes = True , è proprio così.

Aggiornare

Questo è il mio codice così com'è ora che rimuove il tag BR di chiusura

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)

Aggiornamento 2

Ho finito per leggere il mio file modello come una stringa standard, quindi caricare l'html in questo modo

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)

Risposta accettata

Succede perché l'Html Agility Pack gestisce il BR in un modo speciale. Supporta ancora la sintassi HTML 3.2 (ma esistente sul web oggi) in cui il BR potrebbe essere dichiarato senza un tag di chiusura (i browser lo gestiscono comunque correttamente ...).

Per modificare questo comportamento predefinito, è necessario modificare la proprietà HtmlNode.ElementFlags , in questo modo:

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

che mostrerà:

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

Risposta popolare

Come per @Simon Mourier, il seguente codice C # funziona nella versione 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();

ha il seguente valore di stringa per postParsed

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



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché