HtmlAgilityPack - Hace
cerrarse por alguna razón?

c# html-agility-pack

Pregunta

Acabo de escribir esta prueba para ver si estaba loca ...

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(@"
<!DOCTYPE html>
<html>
    <head>
        <title>Form Test</title>
    </head>
    <body>
        <form>
            <input type=""text"" />
            <input type=""reset"" />
            <input type=""submit"" />
        </form>
    </body>
</html>
");
            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 <form> a <xxx> me da:

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

(Como debería). Entonces ... parece que esos elementos de entrada no están contenidos dentro del formulario, sino directamente dentro del cuerpo, como si el <form> simplemente se cerrara de inmediato. ¿Que pasa con eso? ¿Es esto un error?


Cavando 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 deben estar vacías.

Respuesta aceptada

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

Puedes cambiar esto sin recompilar. La lista ElementFlags es una propiedad estática en la clase HtmlNode. Se puede quitar con

    HtmlNode.ElementsFlags.Remove("form");

antes de hacer la carga de documentos


Respuesta popular

Ya que 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 el año 2000, HTML 3.2 era el estándar. Probablemente sepa que las etiquetas pueden superponerse perfectamente en HTML. Es decir: <b>bold<i>italic and bold</b>italic</i> ( 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 puede superponerse perfectamente.

Dado que HAP ha sido diseñado para manejar cualquier contenido HTML, en lugar de dividir la mayoría de las páginas que podría encontrar en ese momento, simplemente decidimos manejar las etiquetas superpuestas como VACÍO (usando la propiedad ElementFlags), por lo que:

  • todavía puedes cargarlos
  • puede guardarlos nuevamente 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 en día, con XHTML / XML en casi todas partes, esto suena extraño, pero es por eso que creé ElementFlags :)



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é