¿Cómo subestimar / agregar elemento raíz en HtmlAgilityPack?

c# html html-agility-pack

Pregunta

Supongamos que tengo el siguiente código HTML:

<p>Hello, bla-bla-bla</p>
<a href="somesite">Click here</a>

Como puedes ver, no tiene etiquetas html / body. Lo que quiero hacer es agregar etiquetas html y del cuerpo en la parte superior del documento.

Intenté agregar una etiqueta html con el siguiente código:

 var el = doc.CreateElement("html");
 var nodes = doc.DocumentNode.ChildNodes;
 doc.DocumentNode.RemoveAllChildren();
 el.AppendChildren(nodes);    
 doc.DocumentNode.AppendChild(el);  

Pero después de eso, una llamada doc.DocumentNode.WriteContentTo() devuelve <html></html> . Si cambio el orden de ejecución de las últimas líneas:

var el = doc.CreateElement("html");
var nodes = doc.DocumentNode.ChildNodes;
doc.DocumentNode.RemoveAllChildren();
doc.DocumentNode.AppendChild(el); 
el.AppendChildren(nodes);  

doc.DocumentNode.WriteContentTo() System.StackOverflowException después de doc.DocumentNode.WriteContentTo() .

La posible solución puede ser algo como esto:

doc.LoadHtml("<html>" + doc.DocumentNode.WriteContentTo() + "</html>")

pero será ineficaz debido a la revisión del documento completo.

¿Tiene alguna idea de cómo se puede resolver este problema de manera eficaz en términos de rendimiento?

Respuesta aceptada

Finalmente, lo tengo para trabajar. La primera muestra no doc.DocumentNode.ChildNodes porque doc.DocumentNode.ChildNodes no devuelve la copia de HtmlNodeCollection , sino la propia colección de nodos. Esto causó que todos los nodos de la colección fueran eliminados antes de agregarlos a el . El siguiente código hace el truco:

var el = doc.CreateElement("html");
var nodes = doc.DocumentNode.ChildNodes;
el.AppendChildren(nodes);    
doc.DocumentNode.RemoveAllChildren();
doc.DocumentNode.AppendChild(el);  


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é