HtmlAgilityPack - 删除节点时保持文本位置

时间:2013-01-28 01:01:50

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

当我删除一个同时包含文本和子节点的节点(keepGrandChildren)时,文本会在子节点之后一直推送,而不是保留在原始位置。

示例:

var doc = new HtmlDocument();
doc.LoadHtml(@"
<span id='first'>
    This text comes first.
    <span id='second'>This text comes second.</span>
</span>");

var node = doc.GetElementbyId("first");
node.ParentNode.RemoveChild(node, true);
doc.Save(Console.Out);

我得到的输出是:

    <span id='second'>This text comes second.</span>
        this text comes first.

而不是:

    this text comes first.
    <span id='second'>This text comes second.</span>


是否有任何方法可以使用keepGrandChildren删除节点而不将内部文本推向最后?
我想保留绝对顺序,并确保没有文本或节点更改其原始位置,否则文档将被破坏。

编辑: 我正在使用HtmlAgilityPack 1.4.6.0.NET 4.0

1 个答案:

答案 0 :(得分:3)

这是HtmlAgilityPack中的know issue。以下代码应该可以解决问题:

public static void RemoveChildKeepGrandChildren(HtmlNode parent, HtmlNode oldChild)
{
    if (oldChild.ChildNodes != null)
    {
        HtmlNode previousSibling = oldChild.PreviousSibling;
        foreach (HtmlNode newChild in oldChild.ChildNodes)
        {
            parent.InsertAfter(newChild, previousSibling);
            previousSibling = newChild;  // Missing line in HtmlAgilityPack
        }
    }
    parent.RemoveChild(oldChild);
}