Paquete de agilidad HTML: emita la selección de una etiqueta de selección HTML con las etiquetas de opción dentro de

.net c# dom html-agility-pack

Pregunta

Estoy utilizando HTML Agility Pack para seleccionar un elemento y devolver ese elemento y todo lo que contiene de una cadena html que está cargada. Al probar mi código, lo ejecuté en el ejemplo de etiqueta de selección de w3schools:

<select name="cars">
  <option value="volvo">Volvo XC90</option>
  <option value="saab">Saab 95</option>
  <option value="mercedes">Mercedes SLK</option>
  <option value="audi">Audi TT</option>
</select>

Cuando trato de seleccionar y devolver esto con el paquete de agilidad HTML, obtengo (se eliminan las etiquetas de opción):

<select name="cars">
  <option value="volvo">Volvo XC90
  <option value="saab">Saab 95
  <option value="mercedes">Mercedes SLK
  <option value="audi">Audi TT
</select>

Así que hice algunas búsquedas aquí y encontré una instrucción para agregar la línea: HtmlNode.ElementsFlags.Remove ("opción");

Hice eso y ahora obtengo (el texto de las opciones se mueve fuera de las etiquetas de opción):

<select name="cars">
  <option value="volvo"></option>Volvo XC90
  <option value="saab"></option>Saab 95
  <option value="mercedes"></option>Mercedes SLK
  <option value="audi"></option>Audi TT
</select>

Me gustaría que la salida coincida con el HTML original. ¿Qué necesito hacer para conseguir eso?

También estaba jugando con los OptionWriteEmptyNodes cuando, cuando probé con las etiquetas de entrada, se estaba eliminando el cierre automático, agregando que la opción parecía solucionarlo. Lo comenté ahora para asegurarme de que no afectara este problema.

Este es mi código .NET C #:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(content);
HtmlNode.ElementsFlags.Remove("option"); // otherwise, the closing tag is removed.

//doc.OptionWriteEmptyNodes = true;

var nodes = doc.DocumentNode.SelectNodes("//select");

if (nodes == null)
    return "Not found";
else
    return nodes[0].OuterHtml;

Respuesta aceptada

Debe configurar el campo ElementsFlag para que la etiqueta de opción funcione.

HtmlNode.ElementsFlags["option"] = HtmlElementFlag.Closed;

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);

Lo que debería devolver su código HTML original.

Creo que la razón por la que HtmlAgilityPack se comporta de esta manera es porque la etiqueta <option> es irónicamente una etiqueta opcional en HTML que no requiere una etiqueta de cierre.

Tomado de la documentación de la clase HtmlNode y su campo ElementsFlags :

Obtiene una colección de indicadores que definen comportamientos específicos para nodos de elementos específicos. La tabla contiene una lista de entradas de diccionario con el nombre de la etiqueta en minúscula como clave y una combinación de elementos de elemento de contenido como el valor.

Una mirada más a fondo en las HtmlElementFlag HtmlElementFlag revela esto:

Vacío: el nodo está vacío. META o IMG son ejemplo de tales nodos. Cerrado: el nodo se cerrará automáticamente durante el análisis.

Puede ver el código fuente de la clase HtmlNode para ver qué otras etiquetas se consideran 'específicas'.



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é