HtmlAgilityPack Gotas Opciones de finalización de etiquetas

html html-agility-pack parsing

Pregunta

Estoy usando HtmlAgilityPack. Creo un HtmlDocument y LoadHtml con la siguiente cadena:

<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One</option><option value="2">Two</option></select>

Esto hace algunas cosas inesperadas. Primero, da dos errores de analizador, EndTagNotRequired. Segundo, el nodo de selección tiene 4 hijos: dos para las etiquetas de opción y dos más para el texto interno de las etiquetas de opción. Por último, el OuterHtml es así:

<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One<option value="2">Two</select>

Así que, básicamente, está decidiendo dejar caer las etiquetas de cierre en las opciones. Dejemos de lado por un momento si es apropiado y deseable hacerlo. Estoy usando HtmlAgilityPack para probar el código de generación de HTML, por lo que no quiero que tome ninguna decisión por mí ni que dé errores a menos que el HTML esté realmente mal formado. ¿Hay alguna manera de hacer que se comporte como yo quiero? Intenté configurar algunas de las opciones para HtmlDocument, específicamente:

 doc.OptionAutoCloseOnEnd = false;
 doc.OptionCheckSyntax = false;
 doc.OptionFixNestedTags = false;

Esto no está funcionando. Si HtmlAgilityPack no puede hacer lo que quiero, ¿me puede recomendar algo que pueda?

Respuesta aceptada

El mismo error se informa exactamente en la discusión de la página de inicio de HAP, pero parece que no se han hecho arreglos significativos para el proyecto en algunos años. No es alentador.

Una búsqueda rápida de la fuente sugiere que el error podría solucionarse comentando la línea 92 de HtmlNode.cs:

// they sometimes contain, and sometimes they don 't...
ElementsFlags.Add("option", HtmlElementFlag.Empty);

(En realidad no, siempre contienen texto de etiqueta, aunque una cadena en blanco también sería un texto válido. Un autor descuidado puede omitir la etiqueta final, pero eso es cierto para cualquier elemento).

AÑADIR

Una solución equivalente está llamando a HtmlNode.ElementsFlags.Remove("option"); antes de cualquier uso de liberary (sin necesidad de modificar el código fuente de liberary)


Respuesta popular

Parece que hay alguna razón para no analizar la etiqueta de opción como una etiqueta "genérica", para el cumplimiento de XHTML, sin embargo, esto puede ser un verdadero dolor de cabeza.

Mi sugerencia es hacer un reemplazo de toda la cadena y cambiar todas las etiquetas "opción" a etiquetas "my_option", de esa manera usted:

  1. No es necesario modificar la fuente de la biblioteca (y puede actualizarla más adelante).
  2. Puede analizar como normalmente lo haría.

La publicación original en el foro HtmlAgilityPack se puede encontrar en: http://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=14982



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é