Come sostituire / aggiungere l'elemento root in HtmlAgilityPack?

c# html html-agility-pack

Domanda

Supponiamo che abbia seguito il codice HTML:

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

Come puoi vedere, non ha tag html / body. Quello che voglio fare è aggiungere tag html e body in cima al documento.

Ho provato ad aggiungere tag html con il seguente codice:

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

Ma dopo, una chiamata doc.DocumentNode.WriteContentTo() restituisce <html></html> . Se cambio l'ordine di esecuzione delle ultime righe:

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

Ho ottenuto System.StackOverflowException dopo doc.DocumentNode.WriteContentTo() .

La soluzione possibile può essere qualcosa del genere:

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

ma sarà inefficace a causa della piena riproduzione del documento.

Avete qualche idea, come questo problema può essere risolto in modo performante?

Risposta accettata

Alla fine, l'ho fatto funzionare. Il primo campione non funzionava perché doc.DocumentNode.ChildNodes non restituisce la copia di HtmlNodeCollection , ma la raccolta del nodo stessa. Ha causato l'eliminazione di tutti i nodi dalla raccolta prima di aggiungerli a el . Il codice qui sotto fa il trucco:

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


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é