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

本文关键字:节点 删除 集合 HtmlAgilityPack- | 更新日期: 2023-09-27 18:20:59

我正在尝试修复使用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>

我该怎么解释?

请注意:这是WinRTHtmlAgilityPack,因此SelectSingleNode和所有xpath命令对我来说都不可用

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

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

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

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