2010-11-18 72 views
31

我只是寫了這個測試,看看我是不是瘋了...HtmlAgilityPack - <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(); 
     } 
    } 
} 

,並將其輸出:

/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。爲什麼??形式肯定是而不是應該是空的。

+0

出於好奇,它仍然表現得如果你給窗體一個動作和方法? – 2010-11-18 19:54:43

+0

@Marc:那個想法也發生在我身上,是的,它的行爲依然如此。 – mpen 2010-11-18 19:56:29

+0

@Mark - 它*聽起來像它可能是一個錯誤,然後......它*當然*似乎與預期相反。 – 2010-11-18 19:59:36

回答

35

這也報告在this workitem。它包含來自DarthObiwan的建議解決方法。

你可以改變它而不用重新編譯。 ElementFlags列表是HtmlNode類中的一個 靜態屬性。它可以與

HtmlNode.ElementsFlags.Remove("form"); 

除去做文件裝載前

+0

感謝Hans :)我剛剛發現C#支持靜態構造函數......這將是一個放置此修復程序的好地方。 – mpen 2010-11-18 20:19:03

24

由於我原來的HAP作者,我可以解釋爲什麼它被標記爲空:)

這是因爲當HAP是在2000年設計的,HTML 3.2是標準。您可能知道標籤可以在HTML中完美重疊。即:所有瀏覽器都支持<b>bold<i>italic and bold</b>italic</i>加粗斜體和加粗斜體)(儘管它不是HTML規範中的官方代碼)。 FORM標籤也可以完美重疊。

由於HAP已經被設計用於處理任何HTML內容,而不是打破,你會發現在那個時候大多數頁面,我們剛剛決定處理重疊標籤爲空(使用ElementFlags屬性),所以:

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

您唯一不能做的事情就是與API一起工作,使用樹模型,也不使用XSL或任何編程方式。 今天,隨着XHTML/XML幾乎無處不在,這聽起來很奇怪,但這就是爲什麼我創建ElementFlags :)

+0

是的......它聽起來很奇怪。那麼我想問題是你是否有計劃更新HAP以適應當前的實踐? (感謝您的解釋) – mpen 2010-11-21 23:55:51

+0

我不再在HAP上工作(我有另一個類似的圖書館,表現更好 - 它是內部的)。我發佈的最後一個版本是1.3。 HAP現在可以通過codeplex與其他人進行更新。這個「重疊/空標記」問題已經提出了很多次:)你應該在討論/祝願中提出這個問題。 – 2010-11-23 10:02:11

+0

但在OP的例子中,元素不重疊。輸入元素被關閉。我很欣賞你在HAP上所做的工作。這對很多人來說都是巨大的幫助。但希望另一位作者能夠修正它,或者至少有動機的人會分發它。 – Josh 2012-06-15 13:43:05