我正在尝试修复使用contentEditable
<span lang="">
<p>line one</p>
<p>line two</p>
</span>
我想用其子节点替换每个span
节点
<p>line one</p>
<p>line two</p>
这是我尝试过的。
var spans = doc.DocumentNode.Descendants().Where(x => x.Name == "span" && x.Attributes["lang"] != null).ToList();
foreach (var span in spans)
{
foreach (var child in span.ChildNodes)
{
var ch = doc.CreateElement(child.Name);
ch.InnerHtml = child.InnerHtml;
doc.DocumentNode.InsertBefore(ch, span);
}
span.Remove();
}
这会抛出System.ArgumentOutOfRangeException
,并显示以下消息。
Node "<span lang=""></span>" was not found in the collection
我明白为什么会这样。编辑文档会使我的span
元素集合无效。那怎么办呢?
另外,我如何处理未包含在子节点中的文本?假设我找到了这个元素
<span lang="">
<p>line one</p>
<p>line two</p>
line three
</span>
我如何去巢?
请注意: HtmlAgilityPack
为WinRT
,因此我无法使用SelectSingleNode
和所有xpath命令
答案 0 :(得分:3)
至于您的问题,修复方法应该是从父节点调用InsertBefore
,而不是文档根。
此外,我认为您可以直接“移动”节点而无需创建新节点:
foreach (var span in spans)
{
foreach (var child in span.ChildNodes)
{
span.ParentNode.InsertBefore(child, span);
}
span.Remove();
}