HtmlAgilityPack - eliminando todos los nodos en una colección

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

Pregunta

Estoy tratando de arreglar este extraño HTML anidado que obtengo al usar contentEditable

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

Quiero reemplazar cada uno de estos span nodos con sus hijos

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

Esto es lo que he intentado.

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

Esto lanza una System.ArgumentOutOfRangeException con el siguiente mensaje.

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

Entiendo por qué esto está sucediendo. La edición del documento anula mi colección de elementos span . Entonces, ¿cómo hacer esto?

Además, ¿cómo hago frente al texto que no está contenido en un nodo infantil? Supongamos que encontré este elemento

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

¿Cómo deshago eso?

TENGA EN CUENTA: Este es HtmlAgilityPack para WinRT , por lo que SelectSingleNode y todos los comandos xpath no están disponibles para mí

Respuesta aceptada

En cuanto a su problema, la solución debe ser invocar InsertBefore desde el nodo principal , no la raíz del documento .

Además, creo que puedes " mover " directamente los nodos sin crear nuevos:

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


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué