HTML-Agility-Paket entfernt den break-Tag

asp.net html-agility-pack vb.net

Frage

Ich erstelle ein HTML-Dokument mit HTML Agility Pack. Ich lade eine Vorlagedatei und füge dann Inhalt an sie an. All dies funktioniert, aber wenn ich die Ausgabedatei <br/> hat es das schließende Tag aus meinen <br/> -Tags entfernt, um so auszusehen <br> . Was verursacht das?

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)

Mehr Info:

Nachdem ich doc.OptionWriteEmptyNodes = True hinzugefügt hatte, doc.OptionWriteEmptyNodes = True er meine schließenden Bild-Tags.

Aktualisieren

Dies ist mein Code, wie er jetzt aussieht, der das schließende BR-Tag entfernt

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)

Update 2

Am Ende habe ich meine Template-Datei als Standard-String eingelesen und dann den HTML-Code geladen

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)

Akzeptierte Antwort

Es passiert, weil das Html Agility Pack den BR auf eine spezielle Art behandelt. Es unterstützt immer noch die alte (aber im Internet vorhandene) HTML 3.2-Syntax, wo der BR ohne ein schließendes Tag überhaupt deklariert werden könnte (Browser handhaben das übrigens auch noch elegant ...).

Um dieses Standardverhalten zu ändern, müssen Sie die HtmlNode.ElementFlags Eigenschaft wie HtmlNode.ElementFlags ändern:

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

welches anzeigen wird:

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

Beliebte Antwort

Laut @Simon Mourier funktioniert der folgende C # -Code in Version 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();

hat den folgenden Zeichenfolgenwert für postParsed

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum