HtmlAgilityPack - 删除集合中的所有节点

时间:2014-09-08 13:54:14

标签: c# html windows-runtime windows-store-apps html-agility-pack

我正在尝试修复使用contentEditable

获得的这种奇怪的嵌套HTML
<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>

我如何去巢?

请注意: HtmlAgilityPackWinRT,因此我无法使用SelectSingleNode和所有xpath命令

1 个答案:

答案 0 :(得分:3)

至于您的问题,修复方法应该是从父节点调用InsertBefore,而不是文档根

此外,我认为您可以直接“移动”节点而无需创建新节点:

foreach (var span in spans)
{
    foreach (var child in span.ChildNodes)
    {
        span.ParentNode.InsertBefore(child, span);
    }
    span.Remove();
}