¿Puede HTMLAgility Pack dejar etiquetas sin cerrar?

c# html-agility-pack

Pregunta

Necesito analizar una cadena HTML como esta:

<widget attribute="1">
  <header>
    <table>
  </header>
  <item>
    <tr><td>content</td></tr>
  </item>
  <footer>
    </table>
  </footer>
</widget>

Estoy usando Html Agility Pack y puedo encontrar todos los "widgets":

HtmlDocument doc = new HtmlDocument();
doc.OptionAutoCloseOnEnd = false;
doc.OptionOutputAsXml = false;
doc.LoadHtml(htmlString); 
HtmlNodeCollection widgets = doc.DocumentNode.SelectNodes("//widget");

Mi problema es cuando trato de obtener todos los childnodes de Widget node ... HTMLAgility cierra automáticamente todas mis etiquetas, por lo que no puedo recuperar correctamente los nodos de encabezado, elemento y pie de página. La salida generada por Agility es:

<header>
    <table>
</table></header>
<item>
    <tr>
        <td><p>Riga n.1</p></td>
    </tr>
</item>
<footer>

</footer>

Cierra la etiqueta de la tabla en el encabezado y oculta la etiqueta de la tabla en el pie de página. ¿Hay una manera de dejar estas etiquetas sin cerrar? Intenté buscar documentación sobre la lógica del método LoadHtml pero no encontré nada. Creo que necesito jugar con opciones.

¿Me puedes ayudar?

Respuesta popular

Html Agility Pack generalmente no admite etiquetas superpuestas por diseño. Sin embargo, puedes modificarlo así:

HtmlDocument doc = new HtmlDocument();
HtmlNode.ElementsFlags.Add("table", HtmlElementFlag.CanOverlap | HtmlElementFlag.Empty);
doc.LoadHtml(htmlString); 

En este caso, le indica a la biblioteca que trate la TABLA como una etiqueta superpuesta. Como nota al margen, FORM es el único TAG definido de manera predeterminada como una etiqueta superpuesta (vea la razón aquí: HtmlAgilityPack - ¿Se cierra <form> por alguna razón? ).

Sin embargo, esto no viene como un almuerzo gratis ...

Esto significa que la biblioteca ahora verá lo que está dentro de la tabla y cerrará las etiquetas de la tabla como un elemento de texto puro. Por lo tanto, todas las etiquetas dentro de la tabla analizada no serán accesibles mediante programación, no las verá en el DOM, no las verá usando XPATH, etc. pero eso puede ser suficiente para sus necesidades.




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é