当我删除一个同时包含文本和子节点的节点(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
答案 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);
}