HtmlAgilityPack - 是嗎<form>由於某種原因關閉自己?

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)
        {
            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();
        }
    }
}

它輸出:

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();
        }
    }
}

但是,如果我將<form>更改為<xxx>它會給我:

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();
        }
    }
}

(正如它應該)。所以...看起來這些輸入元素包含在表單中,而是直接包含在正文中,就好像<form>只是立即關閉它自己一樣。那是怎麼回事?這是一個錯誤嗎?


通過源頭挖掘,我看到:

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();
        }
    }
}

它有“空”標誌,如META和IMG。為什麼??表格絕對應該是空的。

一般承認的答案

這個工作項目也報導了這一點 。它包含來自DarthObiwan的建議解決方法。

您無需重新編譯即可更改此設置。 ElementFlags列表是HtmlNode類上的靜態屬性。它可以刪除

    HtmlNode.ElementsFlags.Remove("form");

在進行文檔加載之前


熱門答案

由於我是最初的HAP作者,我可以解釋為什麼它被標記為空:)

這是因為在2000年設計HAP時,HTML 3.2才是標準。您可能已經意識到標記可以在HTML中完全重疊。即:所有瀏覽器都支持<b>bold<i>italic and bold</b>italic</i>粗體斜體和粗體斜體)(儘管它在HTML規範中不是正式的)。 FORM標籤也可以完美重疊。

由於HAP設計用於處理任何HTML內容,而不是打破當時可以找到的大多數頁面,我們只是決定將重疊標記處理為EMPTY(使用ElementFlags屬性),因此:

  • 你仍然可以加載它們
  • 您可以在不破壞原始HTML的情況下將其保存回來(如果您不需要以任何編程方式在表單中包含內容)。

你唯一不能做的就是使用API​​,使用樹模型,XSL或任何程序化的方法。今天,幾乎到處都有XHTML / XML,這聽起來很奇怪,但這就是我創建ElementFlags的原因:)




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因