我刚刚写了这个测试来看看我是否疯了...
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]
但是,如果我将<form>
更改为<xxx>
,它会给出以下错误:
/html[1]/body[1]/xxx[1]
(正如应该的那样)。看起来这些输入元素不是在表单内,而是直接在中,就好像<form>
立即关闭一样。这是怎么回事?这是个bug吗?
通过源代码挖掘,我发现:
ElementsFlags.Add("form", HtmlElementFlag.CanOverlap | HtmlElementFlag.Empty);
它具有"empty"标志,就像META和IMG一样。为什么?表单绝对不应该是空的。