有没有办法用HTMLAgilityPack用文本节点替换html节点?

时间:2012-03-19 19:05:31

标签: c# html dom html-agility-pack

我想使用HTMLAgility包用文本节点替换文档中的节点。这样做的目的是删除节点本身周围的标签。目前,我这样做:

//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);
}

(在指出错字后更新,但问题仍然存在)

我使用的方法错了吗?我应该使用另一种方法来执行这样的功能吗?感谢。

1 个答案:

答案 0 :(得分:4)

  

这样做的目的是删除节点本身周围的标签

你的第二个代码剪切执行标记删除除了一个拼写错误(我猜):

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

您应该将hNewNode.InnerHtml替换为hChildNode.InnerHtml,否则您的代码甚至无法编译(使用未分配的变量)。

另外要提一下,在创建文本节点之后,它不会拥有被替换的子节点(而不是这个节点,它将替换节点的InnerHtml属性具有相同的值)。