2010-11-18 6 views
31

Ho appena scritto questa prova per vedere se ero pazzo ...HtmlAgilityPack - Lo <form> si chiude per qualche 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(); 
     } 
    } 
} 

Ed uscite:

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

Ma, se cambio <form>-<xxx> mi dà:

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

(come dovrebbe). Quindi ... sembra che quegli elementi di input siano non contenuti nel modulo, ma direttamente all'interno del corpo, come se lo <form> si chiudesse immediatamente da solo. Cosa succede con quello? è un insetto?


Scavando attraverso la sorgente, mi vedi:

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

Ha il flag "vuoto", come META e IMG. Perché?? Le forme sono sicuramente non supposte essere vuote.

+0

Per curiosità, si comporta ancora così se si dà al modulo un'azione e un metodo? –

+0

@Marc: Anche a me è venuto in mente questo pensiero, e sì, si comporta ancora in questo modo. – mpen

+0

@Mark - * suona * come potrebbe essere un bug allora ... certamente * sembra contrario alle aspettative. –

risposta

35

Segnalato anche in this workitem. Contiene una soluzione alternativa suggerita da DarthObiwan.

È possibile modificare questo senza ricompilare. L'elenco ElementFlags è una proprietà statica nella classe HtmlNode. Può essere rimosso con

HtmlNode.ElementsFlags.Remove("form"); 

prima di fare il carico documento

+0

Grazie Hans :) Ho appena scoperto C# supporta i costruttori statici ... che sarà un buon posto per mettere questa correzione. – mpen

24

Dal momento che sono l'autore HAP originale, posso spiegare perché è contrassegnato come vuoto :)

Questo perché quando HAP è stato progettato, nel 2000, l'HTML 3.2 era lo standard. Probabilmente sei consapevole del fatto che i tag possono sovrapporsi perfettamente in HTML. Ovvero: <b>bold<i>italic and bold</b>italic</i> (grassetto corsivo e grassetto italic) è supportato da tutti i browser (anche se non è ufficialmente nella specifica HTML). E anche il tag FORM può perfettamente sovrapporsi.

Dal HAP è stato progettato per gestire qualsiasi contenuto HTML, piuttosto che rompere la maggior parte delle pagine che si poteva trovare in quel momento, abbiamo appena deciso di gestire i tag sovrapposti come vuoto (utilizzando la proprietà ElementFlags) così:

  • è ancora possibile caricarli
  • è possibile salvarli di nuovo senza rompere l'HTML originale (se non è necessario ciò che è all'interno del modulo in qualsiasi modo programmatico).

L'unica cosa che non si può fare è lavorare con loro con l'API, usando il modello ad albero, né con XSL, né con qualcosa di programmatico. Oggi, con XHTML/XML quasi ovunque, sembra strano, ma è per questo che ho creato ElementFlags :)

+0

Sì .... sembra strano. Immagino che la domanda sia se hai o meno intenzione di aggiornare HAP per lavorare con le pratiche correnti? (Grazie per la spiegazione) – mpen

+0

Non lavoro più su HAP (ho un'altra libreria simile che funziona meglio - è interna). L'ultima versione che ho rilasciato era 1.3. HAP è ora disponibile su codeplex con un'altra persona che può aggiornarlo. Questa domanda "sovrapposizione/tag vuoto" è stata sollevata molte volte :) dovresti sollevare questa preoccupazione nelle discussioni/desideri. –

+0

Ma nell'esempio dell'OP, gli elementi non si sovrappongono. Gli elementi di input sono chiusi. Apprezzo il lavoro che hai svolto su HAP. È un grande aiuto per molte persone. Ma speriamo che l'altro autore lo risolva o almeno qualcuno con la motivazione lo sbagli. – Josh

Problemi correlati