2012-03-19 144 views
1

我想用HTMLAgility pack來替換文檔中的節點和文本節點。這樣做的目的是去除節點本身周圍的標籤。目前,我做這樣的事情:有沒有辦法用HTMLAgilityPack替換帶有文本節點的html節點?

//This code fixes redundant HTML formatting tags 
//This is a snippet of code 
foreach (var hChildNode in hd.DocumentNode.SelectNodes("//b//b | //i//i | //u//u") ?? Enumerable.Empty<HtmlNode>()) 
    hChildNode.Name = "remove"; 
StringBuilder sb = new StringBuilder(hd.DocumentNode.WriteTo()); 
sb.Replace("<remove>", string.Empty); 
sb.Replace("</remove>", string.Empty); 

有沒有更好的方法來做到這一點?如果我嘗試創建一個新的文本節點,然後執行類似下面的代碼片段,我收到一個無效的轉換錯誤:

foreach (var hChildNode in hd.DocumentNode.SelectNodes("//b//b | //i//i | //u//u") ?? Enumerable.Empty<HtmlNode>()) 
{ 
    HtmlNode hNewNode = hd.CreateTextNode(hChildNode.InnerHtml); 
    hChildNode.ParentNode.ReplaceChild(hNewNode, hChildNode); 
} 

(錯字指出後更新,但問題仍然存在)

我使用的方法錯了嗎?我應該用另一種方法來執行這樣的功能嗎?謝謝。

回答

4

The purpose of this is to remove tags surrounding the node itself

剪斷你的第二個代碼執行完全相同標籤移除除了一個錯字(我猜):

HtmlNode hNewNode = hd.CreateTextNode(hNewNode.InnerHtml); 

你應該hChildNode.InnerHtml取代hNewNode.InnerHtml否則你的代碼甚至不會編譯(使用未分配變量)。

也想提及,創建文本節點後,它將不會有被替換的子節點(而不是它將具有替換節點的InnerHtml屬性相同的值)。

+0

你完全正確,那是我在寫這張票時犯的一個錯字。所以,亞歷克斯,你告訴我,當你嘗試使用ReplaceChild方法時你不會收到無效的轉換異常?如果是這樣的話,我將不得不調查我使用的版本是否存在問題。對我來說,升級敏捷包並不是微不足道的(至少對於我使用的應用程序來說...否則,是的,下載最新源代碼是相當簡單的)。 – 2012-03-21 15:44:55

+0

@Arthur Edmunds,你可以粘貼HTML代碼片段,導致一個'InvalidCastException'給你嗎? – Alex 2012-03-22 07:19:42

相關問題