一尘不染

HtmlAgilityPack —是否 由于某种原因关闭自己?

c#

我只是写了这个测试,看看我是否疯了…

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。为什么??表单绝对 应该为空。


阅读 352

收藏
2020-05-19

共1个答案

一尘不染

工作项中也有报告。它包含DarthObiwan建议的解决方法。

您可以更改它而无需重新编译。ElementFlags列表是HtmlNode类的静态属性。可以用

    HtmlNode.ElementsFlags.Remove("form");

在加载文件之前

2020-05-19