HtmlAgilityPack - rimuove tutti i nodi in una raccolta

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

Domanda

Sto cercando di risolvere questo strano codice nidificato che ottengo dall'utilizzo di contentEditable

<span lang="">
   <p>line one</p>
   <p>line two</p>
</span>

Voglio sostituire ciascuno di questi nodi di span con i suoi figli

<p>line one</p>
<p>line two</p>

Ecco cosa ho provato.

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();
}

Ciò genera un System.ArgumentOutOfRangeException con il seguente messaggio.

Node "<span lang=""></span>" was not found in the collection

Capisco perché questo sta accadendo. La modifica del documento invalida la mia raccolta di elementi span . Quindi come si fa a fare questo?

Inoltre, come faccio a far fronte al testo che non è contenuto in un childnode? Supponiamo di aver trovato questo elemento

<span lang="">
   <p>line one</p>
   <p>line two</p>
   line three
</span>

Come lo annullo?

NOTA BENE: Questo è HtmlAgilityPack per WinRT , quindi SelectSingleNode e tutti i comandi xpath non sono disponibili per me

Risposta accettata

Per quanto riguarda il problema, la correzione dovrebbe essere quella di richiamare InsertBefore dal nodo padre , non dalla radice del documento .

Inoltre penso che puoi " spostare " i nodi direttamente senza crearne di nuovi:

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


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché