2010-02-27 13 views
3

免責聲明:這是一個我正在爲樂趣而做的個人項目。我不打算使用現有的庫,因爲它會從learning more about wheels中獲得一些快樂。如何設計一個對象來表示所有HTML表單元素?

這就是說,我正在研究一個網絡蜘蛛,並且我遇到了如何用單個對象來表示HTML表單元素的問題。

我想要做的是有一個「HTML文檔」對象,其中包含所有表單元素的數組作爲其屬性之一。問題是我找不到一種方法來代表<input />標籤以及<select />標籤,因爲選擇標籤可以有多個子標籤<option />

有沒有什麼好的方法可以代表<input />標籤,它們基本上只存儲名稱/值對,<select />標籤在同一個類中有一組名/值對?

我想出迄今最好的辦法是把一個<select />標籤作爲單獨的表單字段,類似於我會如何表示<input type="radio" /><input type="checkbox" /><option />標籤。

所以我有這樣的:

class FormField { 
    public string Name { get; set; } 
    public string Value { get; set; } 
    public string Type { get; set; } 
} 

然後集合類迭代會:

  • 集合類將是一個「數組的數組」。外部數組對於HTML文檔中的每個名稱都有一個內部數組。
  • 其索引器可以通過名稱獲取字段。該索引將返回一個FormField對象的數組。
  • 枚舉整個文檔的表單域時,每個迭代都會有一個FormField對象的數組,因爲它將是一個數組數組。

這是最好的解決方案,還是有一種更簡單的方法來表示?

回答

1

我會將整個文檔視爲以body標籤開始的父子鏈接的結構。第一個標籤是身體標籤。任何頂級div,p,form等標籤都會進入Children對象。當你形成像選擇元素,你就可以在選擇的填充值更htmlObjects

class htmlObject { 
    public string Name { get; set; } 
    public string Value { get; set; } 
    public string Type { get; set; } 
    public List<htmlObject> Children { get; } 
} 

從你的榜樣,你缺少的是兒童屬性來表示的基本屬性。

當您準備好更詳細地定義元素時,然後class htmlObject變爲IhtmlObject接口,然後爲每個標記創建專門的類。然後specialize標籤可以實現你想要處理每個標籤特殊條件的功能。

+0

我認爲,但我試圖避免需要構建一個完整的DOM樹,只創建一個對我的蜘蛛很重要的元素列表(鏈接和表單字段,可能是圖像元素和外部CSS/JavaScript URL ) – 2010-02-27 15:15:49

+0

很好...然後用form標籤作爲基本元素而不是body標籤來構建結構。從那一刻起,其他一切都適用。 – JDMX 2010-02-27 21:31:55

2

你是想表示dom結構,或者它們會出現在http-post中的值?

具有相同名稱的兩個輸入將導致值發佈兩次,並且類似於您已選中複選框(具有相同名稱)。你有沒有檢查過會發生什麼,如果你有一個同名的文本框和複選框?你可以在他們之間產生的http-post不同?在那種情況下你應該使用什麼類型?

試過了一個簡單的NameValueCollection,它允許你爲每個鍵存儲幾個字符串值?

+0

最終目標是執行HTTP POST。我並不想要表示DOM結構,因爲我構建的主要目的是成爲蜘蛛。我寫了一個非常基本的HTML解析器來解析出單個節點。我現在正想要決定如何表示嘗試抓取頁面所需的節點。這就是爲什麼我不想構建完整頁面的DOM,因爲構建DOM對象不一定會幫助我獲得超鏈接和表單元素等內容。 – 2010-02-27 16:47:27

+0

網絡蜘蛛通常不會遵循forms/http-posts,或者試圖僞造這些。 – sisve 2010-02-27 23:10:14

相關問題