HTML Agility Pack RemoveChild - 不按预期运行

时间:2011-10-27 03:34:34

标签: c# html-agility-pack

说我想从这个html中删除span标记:

<html><span>we do like <b>bold</b> stuff</span></html>

我期待这段代码能够完成我所追求的目标

string html = "<html><span>we do like <b>bold</b> stuff</span></html>";
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);

HtmlNode span = doc.DocumentNode.Descendants("span").First();
span.ParentNode.RemoveChild(span, true); //second parameter is 'keepGrandChildren'

但输出如下:

<html> stuff<b>bold</b>we do like </html>

它似乎正在反转跨度内的子节点。我做错了吗?

3 个答案:

答案 0 :(得分:11)

看起来像HtmlAgilityPack中的错误 - 请参阅他们的问题注册:

http://htmlagilitypack.codeplex.com/workitem/9113

有趣的是,这是4年前提出的......

这是一个代码段,它将删除所有span标记(或您指定的任何其他标记),并使其他节点保持正确的顺序。

void Main()
{
    string html = "<html><span>we do like <b>bold</b> stuff</span></html>";
    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(html);
    RemoveTags(doc, "span");
    Console.WriteLine(doc.DocumentNode.OuterHtml);
}

public static void RemoveTags(HtmlDocument html, string tagName)
{
    var tags = html.DocumentNode.SelectNodes("//" + tagName);
    if (tags!=null)
    {
        foreach (var tag in tags)
        {
            if (!tag.HasChildNodes)
            {
                tag.ParentNode.RemoveChild(tag);
                continue;
            }

            for (var i = tag.ChildNodes.Count - 1; i >= 0; i--)
            {
                var child = tag.ChildNodes[i];
                tag.ParentNode.InsertAfter(child, tag);
            }
            tag.ParentNode.RemoveChild(tag);
        }
    }
}

答案 1 :(得分:4)

foreach (HtmlNode child in tag.ChildNodes)
{
    tag.ParentNode.InsertBefore(child, tag);
}

tag.Remove();

答案 2 :(得分:3)

仅仅是为了记录,这是我的版本,基于这个问题的答案:

using HtmlAgilityPack;

internal static class HtmlAgilityPackExtensions
{
    public static void RemoveNodeKeepChildren(this HtmlNode node)
    {
        foreach (var child in node.ChildNodes)
        {
            node.ParentNode.InsertBefore(child, node);
        }
        node.Remove();
    }
}