HtmlAgilityPack - Est-ce que
se fermer pour une raison quelconque?

c# html-agility-pack

Question

Je viens d'écrire ce test pour voir si j'étais fou ...

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

Et cela donne:

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

Mais si je change de <form> en <xxx> cela me donne:

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

(Comme il se doit). Donc ... il semble que ces éléments d'entrée ne sont pas contenus dans le formulaire, mais directement dans le corps, comme si le <form> venait juste de se fermer immédiatement. Quoi de neuf avec ça? Est-ce un bug?


En fouillant dans la source, je vois:

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

Il a le drapeau "vide", comme META et IMG. Pourquoi?? Les formulaires ne sont certainement pas censés être vides.

Réponse acceptée

Ceci est également rapporté dans ce workitem . Il contient une solution de contournement suggérée par DarthObiwan.

Vous pouvez changer cela sans recompiler. La liste ElementFlags est une propriété statique de la classe HtmlNode. Il peut être enlevé avec

    HtmlNode.ElementsFlags.Remove("form");

avant de charger le document


Réponse populaire

Puisque je suis l'auteur original de HAP, je peux expliquer pourquoi il est marqué comme vide :)

En effet, lors de la conception de HAP, en 2000, HTML 3.2 était la norme. Vous savez probablement que les balises peuvent parfaitement se chevaucher en HTML. C’est-à-dire que <b>bold<i>italic and bold</b>italic</i> ( gras italique et gras italique) est pris en charge par tous les navigateurs (bien qu’il ne soit pas officiellement dans la spécification HTML). Et la balise FORM peut également parfaitement se chevaucher.

Puisque HAP a été conçu pour gérer n’importe quel contenu HTML, plutôt que pour casser la plupart des pages que vous pouviez trouver à ce moment-là, nous avons simplement décidé de gérer les balises qui se chevauchent comme EMPTY (à l’aide de la propriété ElementFlags).

  • vous pouvez toujours les charger
  • vous pouvez les sauvegarder sans casser le code HTML d'origine (si vous n'avez pas besoin de ce que contient le formulaire de manière programmatique).

La seule chose que vous ne pouvez pas faire est de travailler avec eux avec l'API, en utilisant le modèle d'arborescence, ni avec XSL, ou quelque chose de programmatique. Aujourd'hui, avec XHTML / XML presque partout, cela semble étrange, mais c'est pourquoi j'ai créé les ElementFlags :)



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi