【问题标题】:HtmlAgilityPack -- Does <form> close itself for some reason?HtmlAgilityPack -- <form> 是否出于某种原因自行关闭?
【发布时间】:2010-11-18 19:44:19
【问题描述】:

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

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]/form[1]
/html[1]/body[1]/input[1]
/html[1]/body[1]/input[2]
/html[1]/body[1]/input[3]

但是,如果我将 &lt;form&gt; 更改为 &lt;xxx&gt;,它会给我:

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

(应该如此)。所以...看起来这些输入元素包含在表单中,而是直接包含在正文中,就好像&lt;form&gt; 立即关闭了自己一样。那是怎么回事?这是一个错误吗?


挖掘源码,我明白了:

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

它有“空”标志,如 META 和 IMG。为什么??表单绝对应该是空的。

【问题讨论】:

  • 出于好奇,如果你给表单一个动作和方法,它的行为是否仍然如此?
  • @Marc:我也有这个想法,是的,它的行为仍然如此。
  • @Mark - 它听起来可能是一个错误......它当然似乎与预期相反。
  • @Marc:那太糟糕了。我的整个项目都以此为基础,现在我发现我不能相信它会做预期的事情。可能必须切换到 SgmlReader,但我不知道这是否会更好。
  • 我完全同意。这是一个有趣的发现(我明天必须回来投票 - 我今天的票已经用完了)

标签: c# html-agility-pack


【解决方案1】:

这也在this workitem 中报告。它包含来自 DarthObiwan 的建议解决方法。

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

    HtmlNode.ElementsFlags.Remove("form");

在加载文档之前

【讨论】:

  • 谢谢 Hans :) 我刚刚发现 C# 支持静态构造函数...这将是解决此问题的好地方。
【解决方案2】:

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

这是因为在 2000 年设计 HAP 时,HTML 3.2 是标准。您可能知道标签可以在 HTML 中完美重叠。即:&lt;b&gt;bold&lt;i&gt;italic and bold&lt;/b&gt;italic&lt;/i&gt;粗体斜体和粗体斜体)被所有浏览器支持(尽管它不是正式在 HTML 规范中)。而且FORM标签也可以完美重叠。

由于 HAP 旨在处理任何 HTML 内容,而不是破坏您当时可以找到的大多数页面,我们只是决定将重叠标签处理为 EMPTY(使用 ElementFlags 属性),所以:

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

您唯一不能做的就是通过 API、树模型、XSL 或任何编程方式来使用它们。 今天,XHTML/XML 几乎无处不在,这听起来很奇怪,但这就是我创建 ElementFlags 的原因:)

【讨论】:

  • 是的....听起来确实很奇怪。我想问题是你是否有任何计划更新 HAP 以适应当前的实践? (谢谢解释)
  • 我不再在 HAP 上工作(我有另一个类似的库,性能更好 - 它是内部的)。我发布的最后一个版本是 1.3。 HAP 现在可以在 codeplex 上与另一个可以更新它的人一起使用。这个“重叠/空标签”问题已被多次提出:)您应该在讨论/愿望中提出这个问题。
  • 但在 OP 的示例中,元素没有重叠。输入元素已关闭。我很欣赏你在 HAP 上所做的工作。这对许多人来说是一个巨大的帮助。但希望其他作者能修复它,或者至少有动机的人会分叉它。
  • 这不是一个“修复”,因为它是设计使然,可通过代码配置,并且是开源的。这可能/将会是一个重大变化。
猜你喜欢
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多