C# HtmlAgilityPack—确实<;表格>;因为某种原因而关闭自己?

C# HtmlAgilityPack—确实<;表格>;因为某种原因而关闭自己?,c#,html-agility-pack,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) { v

我只是写了这个测试看看我是不是疯了

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();
        }
    }
}
但是,如果我将
更改为
,它会给我:

/html[1]/body[1]/xxx[1]
(应该如此)。所以这些输入元素似乎不包含在表单中,而是直接包含在主体中,就好像
立即关闭了自己。怎么回事?这是虫子吗


从源头上挖掘,我发现:

ElementsFlags.Add("form", HtmlElementFlag.CanOverlap | HtmlElementFlag.Empty);
它有“空”标志,如META和IMG。为什么?表单绝对不应该是空的。

中也报告了这一点。它包含来自DarthObiwan的建议解决方案

您可以在不重新编译的情况下对此进行更改。ElementFlags列表是一个 HtmlNode类的静态属性。可以使用以下方法将其移除:

    HtmlNode.ElementsFlags.Remove("form");
在进行文档加载之前


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

这是因为在2000年设计HAP时,HTML3.2是标准的。您可能知道标记在HTML中可以完全重叠。也就是说:
bolditalic和bolditalic
(bolditalic和bolditalic)受到所有浏览器的支持(尽管HTML规范中没有正式的支持)。表单标签也可以完全重叠

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

  • 您仍然可以加载它们
  • 您可以在不破坏原始HTML的情况下将它们保存回去(如果您不需要任何编程方式的表单内部内容)
您唯一不能做的事情就是使用API、树模型、XSL或任何编程工具来处理它们。
今天,XHTML/XML几乎无处不在,这听起来很奇怪,但这就是为什么我创建ElementFlags:)

出于好奇,如果你给表单一个动作和方法,它还会这样吗?@Marc:我也有这个想法,是的,它仍然是这样。@Mark-听起来可能是个bug。。。这显然与预期相反。@Marc:那太糟糕了。我把我的整个项目都建立在这个基础上,现在我发现我不能相信它能完成预期的任务。可能不得不改用SgmlReader,但我不知道这是否会更好。我完全同意。这是一个有趣的发现(我明天必须回来投票-我今天的票已经用完了)谢谢Hans:)我刚刚发现C#支持静态构造函数。。。那将是一个放置此修复的好地方。是的。。。。听起来确实很奇怪。我想接下来的问题是,你是否有任何计划更新HAP以适应当前的实践?(感谢您的解释)我不再使用HAP(我有另一个性能更好的类似库,它是内部库)。我发布的最后一个版本是1.3。HAP现在可以在codeplex上使用,其他人可以对其进行更新。这个“重叠/空标签”问题已经被多次提出:)你应该在讨论/愿望中提出这个问题。但是在OP的例子中,元素没有重叠。输入元素是闭合的。我很感激你在HAP上所做的工作。这对很多人来说是一个巨大的帮助。但希望另一位作者会修复它,或者至少有人会有动力来修复它。这不是一个“修复”,因为它是通过设计、代码配置和开源实现的。这可能是一个突破性的变化。
    HtmlNode.ElementsFlags.Remove("form");