HtmlAgilityPack - 出于某种原因,<form>会自行关闭吗?

mpe*_*pen 34 c# html-agility-pack

我刚写了这个测试,看看我是不是疯了......

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它输出:

/html[1]/body[1]/form[1]
/html[1]/body[1]/input[1]
/html[1]/body[1]/input[2]
/html[1]/body[1]/input[3]
Run Code Online (Sandbox Code Playgroud)

但是,如果我改变<form><xxx>它给了我:

/html[1]/body[1]/xxx[1]
Run Code Online (Sandbox Code Playgroud)

(正如它应该).所以...看起来那些输入元素包含在表单中,而是直接在正文中,就像<form>刚刚关闭自己一样.那是怎么回事?这是一个错误吗?


通过源头挖掘,我看到:

ElementsFlags.Add("form", HtmlElementFlag.CanOverlap | HtmlElementFlag.Empty);
Run Code Online (Sandbox Code Playgroud)

它有"空"标志,如META和IMG.为什么??形式绝对应该是空的.

Han*_*ant 37

这个工作项目也报道了这一点.它包含来自DarthObiwan的建议解决方法.

您无需重新编译即可更改此设置.ElementFlags列表是HtmlNode类上的静态属性.它可以删除

    HtmlNode.ElementsFlags.Remove("form");
Run Code Online (Sandbox Code Playgroud)

在进行文档加载之前


Sim*_*ier 25

由于我是最初的HAP作者,我可以解释为什么它被标记为空:)

这是因为在2000年设计HAP时,HTML 3.2才是标准.您可能已经意识到标签可以在HTML中完美重叠.这就是:<b>bold<i>italic and bold</b>italic</i>(黑体斜体和粗体斜体)是由所有的浏览器都支持(虽然它不是正式的HTML规范).FORM标签也可以完美重叠.

由于HAP设计用于处理任何HTML内容,而不是打破当时可以找到的大多数页面,我们决定将重叠标记处理为EMPTY(使用ElementFlags属性),因此:

  • 你仍然可以加载它们
  • 您可以在不破坏原始HTML的情况下将其保存回来(如果您不需要以任何编程方式在表单中使用内容).

你唯一不能做的就是使用API​​,使用树模型,XSL或任何程序化的方法.今天,几乎到处都有XHTML/XML,这听起来很奇怪,但这就是我创建ElementFlags的原因:)

  • 这不是一个"修复",因为它是设计,可由代码和开源配置.它可能/将是一个突破性的变化. (3认同)