如果节点没有父节点,如何删除它

时间:2012-04-17 12:35:28

标签: c# asp.net .net html-agility-pack

我正在使用HTML敏捷包来清理所见即所得的输入。这可能不是最好的方法,但我正在与正则表达式接触爆炸的开发人员一起工作,这样就足够了。

我的WYSIWYG内容看起来像这样(例如):

<p></p>
<p></p>
<p><span><input id="textbox" type="text" /></span></p>

我需要删除空的段落标记。这就是我现在正在做的事情:

HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//p");
if (nodes == null)
    return;

foreach (HtmlNode node in nodes)
{
    node.InnerHtml = node.InnerHtml.Trim();
    if (node.InnerHtml == string.Empty)
        node.ParentNode.RemoveChild(node);
}

但是,由于HTML不是完整的文档,因此段落标记没有父节点,因此RemoveChild将为ParentNode,因此{{1}}将失败。

我找不到另一种删除标签的方法,有人可以用另一种方法指出我吗?

2 个答案:

答案 0 :(得分:3)

从技术上讲,第一级元素是文档根目录的子元素,因此以下代码应该起作用:

if (node.InnerHtml == String.Empty) {
    HtmlNode parent = node.ParentNode;
    if (parent == null) {
        parent = doc.DocumentNode;
    }
    parent.RemoveChild(node);
}

答案 1 :(得分:0)

你想要从集合中删除,对吧?

HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//p");
if (nodes == null)
    return;

for (int i = 0; i < nodes.Count - 1; i++)
{
    nodes[i].InnerHtml = nodes[i].InnerHtml.Trim();
    if (nodes[i].InnerHtml == string.Empty)
        nodes.Remove(i);
}