HtmlAgilityPack - 刪除集合中的所有節點

c# html html-agility-pack windows-runtime windows-store-apps

我正在嘗試修復使用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>

我如何去巢?

請注意:這是WinRT HtmlAgilityPack ,因此我無法使用SelectSingleNode和所有xpath命令

一般承認的答案

至於您的問題,修復應該是從父節點而不是文檔根調用InsertBefore

此外,我認為你可以直接“ 移動 ”節點而不創建新節點:

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



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因