我只是写了这个测试,看看我是否疯了…
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>它,则会得到:
<form>
<xxx>
/html[1]/body[1]/xxx[1]
(正如它应该)。所以…看起来这些输入元素 没有 包含在表单中,而是直接包含在主体中,就好像<form>刚关闭自己一样。那是怎么回事?这是错误吗?
深入了解源代码,我看到:
ElementsFlags.Add("form", HtmlElementFlag.CanOverlap | HtmlElementFlag.Empty);
它具有“空”标志,例如META和IMG。为什么??表单绝对 不 应该为空。
此工作项中也有报告。它包含DarthObiwan建议的解决方法。
您可以更改它而无需重新编译。ElementFlags列表是HtmlNode类的静态属性。可以用 HtmlNode.ElementsFlags.Remove("form"); 在加载文件之前
您可以更改它而无需重新编译。ElementFlags列表是HtmlNode类的静态属性。可以用
HtmlNode.ElementsFlags.Remove("form");
在加载文件之前