2012-03-19 116 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

相关问题