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 del analizador, EndTagNotRequired. En segundo lugar, 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>

Entonces, básicamente, está decidiendo que deje caer las etiquetas de cierre en las opciones. Dejemos de lado por un momento si es apropiado y deseable hacer eso. 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í o dé algún error a menos que el HTML esté realmente mal formado. ¿Hay alguna manera de hacer que se comporte como 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, ¿puede recomendar algo que pueda hacer?

¿Fue útil?

Solución

Se informa exactamente el mismo error en la discusión de la página de inicio de HAP, pero parece que no se han realizado correcciones significativas en el proyecto en unos pocos años. No es alentador.

Una exploración rápida de la fuente sugiere que el error podría ser reparable al comentar 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 texto válido. Un autor descuidado podría omitir la etiqueta final, pero eso es cierto para cualquier elemento).

ADD

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

Otros consejos

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

Mi sugerencia es hacer un reemplazo completo de la cadena y cambiar todas las '' opciones '' etiquetas a " my_option " etiquetas, de esa manera usted:

  1. No tiene que modificar la fuente de la biblioteca (y puede actualizarla más tarde).
  2. Puede analizar como lo haría habitualmente.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top