HtmlAgilityPack - Does
si chiude per qualche motivo?

c# html-agility-pack

Domanda

Ho appena scritto questo test per vedere se ero pazzo ...

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();
        }
    }
}

E 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]

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

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

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


Scavando attraverso la fonte, vedo:

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

Ha il flag "vuoto", come META e IMG. Perché?? Le forme non dovrebbero assolutamente essere vuote.

Risposta accettata

Questo è anche riportato in questo workitem . Contiene una soluzione alternativa suggerita da DarthObiwan.

Puoi cambiare questo senza ricompilare. L'elenco ElementFlags è una proprietà statica della classe HtmlNode. Può essere rimosso con

    HtmlNode.ElementsFlags.Remove("form");

prima di caricare il documento


Risposta popolare

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

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

Poiché HAP è stato progettato per gestire qualsiasi contenuto HTML, piuttosto che interrompere la maggior parte delle pagine che è possibile trovare in quel momento, abbiamo deciso di gestire i tag sovrapposti come EMPTY (utilizzando la proprietà ElementFlags) in modo tale:

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

L'unica cosa che non puoi 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 :)



Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché