2008-11-16 18 views
22

Estoy usando HtmlAgilityPack. Creo un HtmlDocument y LoadHtml con la siguiente cadena:HtmlAgilityPack Drops Opción End Tags

<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í:

Así que básicamente es decidir para que lo deje las etiquetas de cierre de 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 cometa ningún error a menos que el HTML esté realmente mal formado. ¿Hay alguna forma de hacer que se comporte como yo quiero? Intenté establecer 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?

+0

para cualquier otra persona frente a este tema, véase mi respuesta en http://stackoverflow.com/questions/759355/image-tag-not -closing-with-htmlagilitypack/12096383 # 12096383 para un método de configuración de la respuesta de Bobnce sin modificar la fuente de HAP. – MaxPRafferty

Respuesta

30

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

Un vistazo rápido de la fuente sugiere que el error podría ser corregible 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 la etiqueta, a pesar de una cadena en blanco también sería texto válido. el autor de un descuido podría omitir la etiqueta final, pero entonces eso es cierto de cualquier elemento.)

AÑADIR

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

+0

Impresionante. Muchas gracias. ¡Funciona genial! –

+2

Me encontré con este problema al intentar obtener el valor de InnerText de la opción. Apliqué su solución directamente en mi código usando la HashTable estática expuesta de HtmlNode: HtmlNode.ElementsFlags.Remove ("opción"); –

+0

Hola Jason, ¿cómo resolviste este problema directamente en tu propio código? Intenté HtmlNode.ElementsFlags.Eliminar ("opción"); en mi código, pero no resolvió el problema de la etiqueta img de cierre? Podría darme detalles, por favor, no quiero modificar y recompilar la fuente a menos que sea necesario. ¡Muchas gracias! –

5

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

Mi sugerencia es hacer un todo-cadena-reemplazar y cambiar todas las etiquetas "opción" a "etiquetas" my_option, de esa manera:

  1. No tiene que modificar el código fuente de la biblioteca (y puede actualizarlo más tarde).
  2. Puede analizar como lo haría normalmente.

El post original en el foro HtmlAgilityPack se puede encontrar en: http://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=14982