Le pack d'agilité HTML supprime les balises break

asp.net html-agility-pack vb.net

Question

Je crée un document HTML à l'aide du pack d'agilité HTML. Je charge un fichier de modèle, puis y ajoute du contenu. Tout cela fonctionne, mais lorsque je visualise le fichier de sortie, il supprime la balise de fermeture de mes balises <br/> pour ressembler à ceci <br> . Qu'est-ce qui cause ça?

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)

Plus d'informations:

Cela supprimait mes balises d'image de fermeture, après avoir ajouté doc.OptionWriteEmptyNodes = True , c'est plutôt le cas.

Mettre à jour

Ceci est mon code tel qu'il est maintenant qui supprime la balise de fermeture 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)

Mise à jour 2

J'ai fini par lire dans mon fichier de modèle comme une chaîne standard puis charger le code HTML comme ceci

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)

Réponse acceptée

Cela arrive parce que le pack d'agilité HTML gère le BR de manière particulière. Il prend toujours en charge l'ancienne syntaxe HTML 3.2 (mais existante sur le Web à l'heure actuelle), dans laquelle le BR peut être déclaré sans balise de fermeture (les navigateurs la traitent toujours aussi gracieusement au passage ...).

Pour changer ce comportement par défaut, vous devez modifier la propriété HtmlNode.ElementFlags , comme ceci:

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

qui affichera:

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

Réponse populaire

Selon @Simon Mourier, le code C # suivant fonctionne dans la 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();

a la valeur de chaîne suivante pour 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();



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi