2013-02-24 61 views
1

我需要解析HTML字符串是這樣的:HTMLAgility Pack可以保留未封閉的標籤嗎?

<widget attribute="1"> 
    <header> 
    <table> 
    </header> 
    <item> 
    <tr><td>content</td></tr> 
    </item> 
    <footer> 
    </table> 
    </footer> 
</widget> 

我使用HTML敏捷性包,我能找到的所有「部件」:

HtmlDocument doc = new HtmlDocument(); 
doc.OptionAutoCloseOnEnd = false; 
doc.OptionOutputAsXml = false; 
doc.LoadHtml(htmlString); 
HtmlNodeCollection widgets = doc.DocumentNode.SelectNodes("//widget"); 

我的問題是,當我嘗試獲取Widget節點的所有子節點。HTMLAgility會自動關閉所有我的標記,因此我無法正確檢索Header,Item和Footer節點。由Agility生成的輸出爲:

<header> 
    <table> 
</table></header> 
<item> 
    <tr> 
     <td><p>Riga n.1</p></td> 
    </tr> 
</item> 
<footer> 

</footer> 

它關閉標題中的表標記,並將頁標記隱藏在頁腳中。有沒有辦法讓這些標籤不封閉?我試圖搜索有關LoadHtml方法邏輯的文檔,但我沒有找到任何東西。我想我需要玩選項。

你能幫我嗎?

+1

這不是一個HTML字符串。 – BoltClock 2013-02-24 14:49:47

+0

我知道這不是一個符合標準的html字符串..我需要解析它,然後我將動態構建標準的html代碼。所以我問是否有辦法用HTMLAgility來管理這種類型的代碼「異常」。 – Gianni 2013-02-24 15:23:03

回答

0

HtmlAgilityPack解析HTML。這是完全破碎的HTML,所以它需要最好的猜測。瀏覽器將不會更好。例如,火狐將這種爲:

<header> 
<item> </item> 
<footer> </footer> 
<table> 
<tbody> 
<tr> 
<td>content</td> 
</tr> 
</tbody> 
</table> 
</header> 

通過使用HTML破,你打開自己高達未定義的行爲,這將是具體實施。修復您的HTML並恢復世界的意義。

+0

嗨spender ..我的HTML有意義..我需要創建一個標準的HTML輸出與模板小部件,喜歡它。 例如該小工具將顯示新聞列表,所以我想使用該代碼構建輸出。然後,我可以寫響應輸出是這樣的:

​​新聞1​​新聞2
我希望你能更好地理解什麼我想解釋。 – Gianni 2013-02-24 15:12:06

1

Html Agility Pack通常不支持設計中的重疊標籤。但是,您可以像這樣調整:

HtmlDocument doc = new HtmlDocument(); 
HtmlNode.ElementsFlags.Add("table", HtmlElementFlag.CanOverlap | HtmlElementFlag.Empty); 
doc.LoadHtml(htmlString); 

在這種情況下,您指示庫將TABLE視爲重疊標記。作爲一個方面說明,FORM是默認情況下唯一定義爲重疊標記的TAG(請參閱此處的原因:HtmlAgilityPack -- Does <form> close itself for some reason?)。

然而,這不來免費的午餐......

這意味着,該庫將看到什麼是表和結束表標記作爲一個純文本元素中。因此,解析表內的所有標記都不會以編程方式訪問,您不會在DOM中看到它,也不會使用XPATH查看它,但這可能足以滿足您的需求。

+0

這是...無效的HTML。 – BoltClock 2013-02-25 07:00:27

+0

@BoltClock - 什麼是無效的HTML? – 2013-02-25 07:01:55

+0

您給定的HTML片段,您描述爲無效的XML或XHTML,但是有效的HTML ...它不適用於三種語言中的任何一種。 – BoltClock 2013-02-25 07:02:26

0

你需要從你的價值觀刪除那些<>符號,那麼你可以XDocument.Parse()它:

<widget attribute="1"> 
    <header>[table]</header> 
    <item>[tr][td]content[/td][/tr]</item> 
    <footer>[/table]</footer> 
</widget> 

只是.Replace('[','<').Replace(']', '>')你讀什麼,你要善於去。

Italian MSDN page about System.Xml.Linq.XDocument class here