剥离HTML标记但使用HTML Agility留下内部文本?

时间:2010-10-14 21:04:37

标签: html html-agility-pack

我正在尝试删除一些HTML标记。我有一个项目,该人保存了一些搜索。问题是关键字已经突出显示。例如。

<p>Here is some <span class='highlite'>awesome</span> example.</p>

Html Agility将其转换为3个节点。再次显示文本节点,范围和文本。我想创建一个单独的标签。所以它看起来像

<p>Here is some awesome example.</p>

我尝试使用css类highlite获取所有标签,然后

 //Stip all retarded hilite tags
 var hiliteTags = from tags in doc.DocumentNode.SelectNodes("//span[@class='hilite']")
                  select tags;

 foreach (var tag in hiliteTags)
 {
      tag.ParentNode.RemoveChild(tag, true);
 }

但结果是文本节点,文本节点,文本节点。我想要一个文本节点。然后我尝试使用

Node.InnerText += someVariable;

但InnerText,尽管文档说的是只读的。

关于如何做到这一点的任何想法?

其次,当我问,有没有办法摆脱只包含文本的节点,它是\ r \ n。我根本不感兴趣,它只是妨碍了解析并使解析变得尴尬。我也希望能够删除它们。例如

<tr>
    <td>Foo</td>
    <td>Bar</td>
</tr>

使用Html Agility成为

Node (tr)
Node (\r\n)
Node (td- Foo)
Node (\r\n)
Node (td - Bar)
Node (\r\n)
Node (tr)

我正在努力选择那些节点。我试过Linq,我尝试过使用XPath。我似乎无法删除它们。

1 个答案:

答案 0 :(得分:0)

如果您只是使用p标记的 InnerText ,并创建一个单独的文档树来保存它,该怎么办?

var root = HtmlNode.CreateNode("<root></root>");
foreach (var node in doc.DocumentNode.SelectNodes("/p"))
{
    var newNode = HtmlNode.CreateNode(string.Format("<p>{0}</p>", node.InnerText));
    root.AppendChild(newNode);
}

这有帮助吗?