Wie man Wurzelelement in HtmlAgilityPack ersetzt / hinzufügt?

c# html html-agility-pack

Frage

Angenommen, ich habe folgenden HTML-Code:

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

Wie Sie sehen können, hat es keine html / body Tags. Ich möchte HTML- und Body-Tags oben auf dem Dokument hinzufügen.

Ich habe versucht, HTML-Tag mit folgendem Code hinzuzufügen:

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

Aber danach gibt ein Aufruf doc.DocumentNode.WriteContentTo() <html></html> . Wenn ich die Ausführungsreihenfolge der letzten Zeilen ändere:

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

Ich habe System.StackOverflowException nach dem doc.DocumentNode.WriteContentTo() .

Mögliche Lösung kann in etwa so aussehen:

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

aber es wird aufgrund der vollständigen Reparierung von Dokumenten unwirksam sein.

Haben Sie Ideen, wie dieses Problem leistungsfähig gelöst werden kann?

Akzeptierte Antwort

Schließlich habe ich es zur Arbeit gebracht. Das erste Beispiel funktionierte nicht, da doc.DocumentNode.ChildNodes nicht die Kopie von HtmlNodeCollection , sondern die doc.DocumentNode.ChildNodes zurückgibt. Es verursachte, dass alle Knoten aus der Sammlung gelöscht wurden, bevor sie zu el hinzugefügt wurden. Der folgende Code macht den Trick:

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum