HtmlAgilityPack: ¿Podría alguien explicar exactamente cuál es el efecto de configurar HtmlDocument OptionAutoCloseOnEnd en true?

c# html-agility-pack

Pregunta

La documentación actual dice:

Define si el cierre para los nodos no cerrados debe realizarse al final o directamente en el documento. Establecer esto en verdadero puede cambiar la manera en que los navegadores renderizan la página. El valor predeterminado es falso.

Lo siento, debo admitir que no entiendo este párrafo. Específicamente "al final" de qué? ¿Y qué significa exactamente "en el documento"? La frase antes de la última suena ominosa. Si la opción está establecida en verdadero y si el formato HTML está correctamente formateado, ¿esto seguirá afectando al documento?

Busqué en el código fuente pero no entendí lo que está sucediendo: el código reacciona a que la propiedad no se configura como verdadera. Consulte HtmlNode.cs y busque OptionAutoCloseOnEnd - línea 1707. También encontré un código funky en HtmlWeb.cs en las líneas 1113 y 1154. Lástima que el navegador del código fuente no muestre números de línea, pero busque OptionAutoCloseOnEnd en la página.

¿Podría ilustrar con un ejemplo lo que hace esta opción?

Estoy utilizando HtmlAgilityPack para corregir algunos html incorrectos y exportar el contenido de la página a xml.

Me encontré con algunas etiquetas html mal superpuestas con formato. Aquí está el fragmento:

<p>Blah bah
<P><STRONG>Some Text</STRONG><STRONG></p>
<UL>
<LI></STRONG>Item 1.</LI>
<LI>Item 2</LI>
<LI>Item 3</LI></UL>

Tenga en cuenta que la primera etiqueta p no está cerrada y observe la etiqueta STRONG superpuesta.

Si configuro OptionAutoCloseOnEnd esto se arregla de alguna manera. Estoy tratando de entender qué es exactamente el efecto de establecer esta propiedad en verdadero en general en la estructura del documento.

Aquí está el código C # que estoy usando:

HtmlDocument doc = new HtmlDocument();
doc.OptionOutputAsXml = true;
doc.OptionFixNestedTags = true;      
//  doc.OptionAutoCloseOnEnd = true;    
doc.LoadHtml(htmlText);

¡Gracias!

Respuesta aceptada

El código actual siempre cierra los nodos no cerrados justo antes de que se cierre el nodo principal. Así que el siguiente código

var doc = new HtmlDocument();
doc.LoadHtml("<x>hello<y>world</x>");
doc.Save(Console.Out);

emitirá esto (el <y> cerrado se cierra antes de que se cierre el <x> )

<x>hello<y>world</y></x>

Originalmente, la opción, cuando se estableció, estaba destinada a poder producir esto en su lugar (no para los tipos de salida XML):

<x>hello<y>world</x></y>

con el cierre <y> establecido al final del documento (eso es lo que significa el "fin"). Tenga en cuenta que en este caso, todavía puede obtener elementos superpuestos.

Esta característica (tal vez inútil, puedo admitir que) se rompió en algún lugar del pasado, no sé por qué.

Tenga en cuenta que el caso de la etiqueta <p> es especial, ya que, de forma predeterminada, se rige por HtmlElementFlag personalizado. Así es como se declara en HtmlNode.cs:

ElementsFlags.Add("p", HtmlElementFlag.Empty | HtmlElementFlag.Closed);

Respuesta popular

La mejor manera de usar HtmlAgilityPack sería abrir y cerrar etiquetas mediante programación donde sea necesario y establecer:

 doc.OptionAutoCloseOnEnd = false;

Lo que le dará el formato esperado.

De lo contrario, la biblioteca buscará las etiquetas que no estén cerradas y las cerrará donde le parezca adecuado según el flujo de ejecución de su código.



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