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