El paquete de agilidad HTML elimina la etiqueta de ruptura

asp.net html-agility-pack vb.net

Pregunta

Estoy creando un documento HTML usando el paquete de agilidad HTML. Cargo un archivo de plantilla y luego le agrego contenido. Todo esto funciona, pero cuando veo el archivo de salida, eliminé la etiqueta de cierre de mis etiquetas <br/> para parecerme a esta <br> . ¿Qué está causando esto?

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)

Más información:

Estaba eliminando mis etiquetas de imagen de cierre, después de que agregué doc.OptionWriteEmptyNodes = True , bastante haciendo eso.

Actualizar

Este es mi código tal como está ahora que elimina la etiqueta de cierre de 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)

Actualización 2

Terminé simplemente leyendo en mi archivo de plantilla como una cadena estándar y luego cargando el html como este

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)

Respuesta aceptada

Sucede porque el Html Agility Pack maneja el BR de una manera especial. Todavía es compatible con la sintaxis HTML 3.2 antigua (pero que existe hoy en día en la web) donde la BR se podría declarar sin ninguna etiqueta de cierre (los navegadores también aún lo manejan con gracia, por cierto ...).

Para cambiar este comportamiento predeterminado, necesita modificar la propiedad HtmlNode.ElementFlags , como esto:

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

que mostrará:

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

Respuesta popular

Según @Simon Mourier, el siguiente código de C # funciona en la versión 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();

tiene el siguiente valor de cadena para postParsed

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


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow