【发布时间】: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]
但是,如果我将 <form> 更改为 <xxx>,它会给我:
/html[1]/body[1]/xxx[1]
(应该如此)。所以...看起来这些输入元素不包含在表单中,而是直接包含在正文中,就好像<form> 立即关闭了自己一样。那是怎么回事?这是一个错误吗?
挖掘源码,我明白了:
ElementsFlags.Add("form", HtmlElementFlag.CanOverlap | HtmlElementFlag.Empty);
它有“空”标志,如 META 和 IMG。为什么??表单绝对不应该是空的。
【问题讨论】:
-
出于好奇,如果你给表单一个动作和方法,它的行为是否仍然如此?
-
@Marc:我也有这个想法,是的,它的行为仍然如此。
-
@Mark - 它听起来可能是一个错误......它当然似乎与预期相反。
-
@Marc:那太糟糕了。我的整个项目都以此为基础,现在我发现我不能相信它会做预期的事情。可能必须切换到 SgmlReader,但我不知道这是否会更好。
-
我完全同意。这是一个有趣的发现(我明天必须回来投票 - 我今天的票已经用完了)
标签: c# html-agility-pack