2010-11-18 14 views
31

acabo redactó esta prueba para ver si yo estaba loco ...HtmlAgilityPack - ¿Se cierra el <form> por algún motivo?

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

/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>-<xxx> me da:

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

(Como debería). Entonces ... parece que esos elementos de entrada son no contenidos en el formulario, pero directamente dentro del cuerpo, como si el <form> se hubiera cerrado inmediatamente. ¿Que pasa con eso? ¿Es esto un error?


de excavación a través de la fuente, veo:

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

Tiene la bandera de "vacío", como META e IMG. ¿¿Por qué?? Los formularios son definitivamente no supuestamente vacíos.

+0

Por curiosidad, ¿todavía se comporta así si le das a la forma una acción y un método? –

+0

@Marc: Ese pensamiento también se me ocurrió, y sí, todavía se comporta de esa manera. – mpen

+0

@Mark - suena * como si fuera un error, entonces ... ciertamente * parece contrario a las expectativas. –

Respuesta

35

Esto también se informó en this workitem. Contiene una solución sugerida de DarthObiwan.

Puede cambiar esto sin volver a compilar. 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

+0

Gracias Hans :) Acabo de descubrir que C# admite constructores estáticos ... ese será un buen lugar para poner esta solución. – mpen

24

Como yo soy el autor original de HAP, puedo explicar por qué está marcada como vacía :)

Esto es porque cuando HAP fue diseñado, en 2000, HTML 3.2 era el estándar. Probablemente estés al tanto de que las etiquetas se pueden superponer 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 se puede superponer perfectamente también.

Desde HAP ha sido diseñado para manejar cualquier contenido HTML, en lugar de romper la mayoría de las páginas que se podía encontrar en ese momento, que decidimos manejar etiquetas superpuestas como VACÍO (con la propiedad ElementFlags) así:

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

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

+0

Sí ... suena extraño. Supongo que la pregunta entonces es si tienes algún plan para actualizar HAP para que funcione con las prácticas actuales. (Gracias por la explicación) – mpen

+0

Ya no trabajo en HAP (tengo otra biblioteca similar que funciona mejor, es interna). La última versión que lancé fue 1.3. HAP ahora está disponible en codeplex con otra persona que puede actualizarlo. Esta pregunta de "superposición/etiqueta vacía" se ha planteado muchas veces :) debe plantear esta preocupación en las discusiones/deseos. –

+0

Pero en el ejemplo de OP, los elementos no se superponen. Los elementos de entrada están cerrados. Aprecio el trabajo que has hecho en HAP. Es una gran ayuda para muchas personas. Pero espero que el otro autor lo arregle o al menos alguien con la motivación lo bifurcara. – Josh

Cuestiones relacionadas