HtmlAgilityPack – ¿ se cierra por alguna razón?

Acabo de escribir esta prueba para ver si estaba loco …

using System; using System.Collections.Generic; using System.Linq; using System.Text; using HtmlAgilityPack; namespace HtmlAgilityPackFormBug { class Program { static void Main(string[] args) { var doc = new HtmlDocument(); doc.LoadHtml(@"    Form Test   
"); var body = doc.DocumentNode.SelectSingleNode("//body"); foreach (var node in body.ChildNodes.Where(n => n.NodeType == HtmlNodeType.Element)) Console.WriteLine(node.XPath); Console.ReadLine(); } } }

Y produce:

 /html[1]/body[1]/form[1] /html[1]/body[1]/input[1] /html[1]/body[1]/input[2] /html[1]/body[1]/input[3] 

Pero, si cambio

a , me da:

 /html[1]/body[1]/xxx[1] 

(Como debería). Entonces … parece que esos elementos de entrada no están contenidos dentro de la forma, sino directamente dentro del cuerpo, como si la

simplemente se cerrara inmediatamente. ¿Que pasa con eso? ¿Es esto un error?


Excavando a través de la fuente, veo:

 ElementsFlags.Add("form", HtmlElementFlag.CanOverlap | HtmlElementFlag.Empty); 

Tiene la bandera “vacía”, como META e IMG. ¿¿Por qué?? Las formas definitivamente no se supone que estén vacías.

    Esto también se informa en este artículo de trabajo . Contiene una solución sugerida de DarthObiwan.

    Puede cambiar esto sin volver a comstackr. La lista ElementFlags es una propiedad estática en la clase HtmlNode. Se puede eliminar con

      HtmlNode.ElementsFlags.Remove("form"); 

    antes de cargar el documento

    Como soy el autor original de HAP, puedo explicar por qué está marcado como vacío 🙂

    Esto se debe a que cuando se diseñó HAP, en 2000, HTML 3.2 era el estándar. Probablemente estés al tanto de que las tags se pueden superponer perfectamente en HTML. Es decir: bolditalic and bolditalic ( negrita cursiva y negrita cursiva) es compatible con todos los navegadores (aunque no está oficialmente en la especificación HTML). Y la etiqueta FORM también se puede superponer perfectamente también.

    Como HAP se diseñó para manejar cualquier contenido HTML, en lugar de romper la mayoría de las páginas que podía encontrar en ese momento, decidimos manejar tags superpuestas como VACÍO (usando la propiedad ElementFlags) de modo que:

    • aún puedes cargarlos
    • puede guardarlos sin romper el HTML original (si no necesita lo que está dentro del formulario de ninguna manera programática).

    Lo único que no puedes hacer es trabajar con ellos con la API, usando el modelo de árbol, ni con XSL, ni nada programático. Hoy, con XHTML / XML casi en todas partes, esto suena extraño, pero es por eso que creé ElementFlags 🙂