HtmlAgilityPack trata todo después de <(menos del signo) como atributos

c# html-agility-pack

Pregunta

Tengo una entrada que recibo a través de un área de texto y la convierto en un documento html, que luego se analiza en un documento PDF.

Cuando mis usuarios ingresan el signo de menos (<) todo frena en mi documento HtmlDocument. HtmlAgilityPack de repente maneja todo después del signo menos que un atributo. Vea la salida:

Dentro de este bloque de datos de caracteres puedo usar guiones dobles tanto como quiera (junto con <, &, = "" ', = "" y = ""') = "" * y = "" * = ""% = "" myparamentity; = "" será = "" be = "" expandido = "" a = "" el = "" texto = "" 'tiene = "" estado = "" expandido' ... sin embargo, = "" i = "" can't = "" use = "" the = "" cend = "" secuencia (if = "" i = "" need = "" to = "" use = "" it = "" i = "" must = "" escape = "" one = "" of = "" = = brackets = "" or = "" the = "" sign =-"=)" =)

Se pone un poco mejor si acabo de añadir el

htmlDocument.OptionOutputOptimizeAttributeValues = true;

lo que me da:

Dentro de este bloque de datos de caracteres puedo usar guiones dobles tanto como quiera (junto con <, &, = ', = y =') = * y = * =% = myparamentity; = will = be = expand = to = the = texto = 'tiene = estado = expandido' ... sin embargo, = i = no puedo = use = la = cend = secuencia (si = i = necesito = para = use = it = i = must = escape = one = de = los = corchetes = o = el = mayor que = signo). =>

He probado todas las opciones en el htmldocument y ninguna de ellas me permite especificar que el analizador no debe ser estricto. Por otro lado, podría ser capaz de vivir con eso eliminando el <, pero agregar todos los signos de igualdad no funciona para mí.

void Main()
{
    var input = @"Within this Character Data block I can use double dashes as much as I want (along with <, &, ', and ') *and * % MyParamEntity; will be expanded to the text 'Has been expanded'...however, I can't use the CEND sequence(if I need to use it I must escape one of the brackets or the greater-than sign).";

    var htmlDoc = WrapContentInHtml(input);

    htmlDoc.DocumentNode.OuterHtml.ToString().Dump();
}

private HtmlDocument WrapContentInHtml(string content)
{
    var htmlBuilder = new StringBuilder();
    htmlBuilder.AppendLine("<!DOCTYPE html>");
    htmlBuilder.AppendLine("<html>");
    htmlBuilder.AppendLine("<head>");
    htmlBuilder.AppendLine("<title></title>");
    htmlBuilder.AppendLine("</head>");
    htmlBuilder.AppendLine("<body><div id='sagsfremstillingContainer'>");
    htmlBuilder.AppendLine(content); 
    htmlBuilder.AppendLine("</div></body></html>");

    var htmlDocument = new HtmlDocument();
    htmlDocument.OptionOutputOptimizeAttributeValues = true;
    var htmlDoc = htmlBuilder.ToString();

    htmlDocument.LoadHtml(htmlDoc);

    return htmlDocument;
}

¿Alguien tiene una idea de cómo puedo resolver este problema?

La pregunta más cercana que puedo encontrar es la siguiente: perder el signo 'less than' en HtmlAgilityPack loadhtml

Donde él realmente se queja de la <desaparición que estaría bien para mí. Por supuesto, arreglar el error de análisis es la mejor solución.

EDITAR: Estoy usando HtmlAgilityPack 1.4.9

Respuesta aceptada

Su contenido es flagrantemente incorrecto. No se trata de "rigor", se trata realmente del hecho de que estás fingiendo que un fragmento de texto es HTML válido. De hecho, los resultados que está obteniendo son exactamente porque el analizador no es estricto.

Cuando necesita insertar texto sin formato en HTML, primero debe codificarlo, de modo que todos los diversos caracteres de control HTML se conviertan a HTML correctamente; por ejemplo, < debe cambiarse a &lt; y & a &amp; .

Una manera de manejar esto es usar el DOM - utilizar InnerText en el objetivo div , en lugar de golpear cadenas juntas y pretender que son HTML. Otra es usar algún método de codificación explícito, por ejemplo, HttpUtility.HtmlEncode .


Respuesta popular

Puede usar System.Net.WebUtility.HtmlEncode que funciona incluso sin una referencia a System.Web.dll que también tiene HttpServerUtility.HtmlEncode

var input = @"Within this Character Data block I can use double dashes as much as I want (along with <, &, ', and ') *and * % MyParamEntity; will be expanded to the text 'Has been expanded'...however, I can't use the CEND sequence(if I need to use it I must escape one of the brackets or the greater-than sign).";
var htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(System.Net.WebUtility.HtmlEncode(input));
Debug.Assert(!htmlDocument.ParseErrors.Any());

Resultado:

Within this Character Data block I can use double dashes as much as I want (along with &lt;, &amp;, &#39;, and &#39;) *and * % MyParamEntity; will be expanded to the text &#39;Has been expanded&#39;...however, I can&#39;t use the CEND sequence(if I need to use it I must escape one of the brackets or the greater-than sign).


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué