Supposons que j'ai le code HTML suivant:
<p>Hello, bla-bla-bla</p>
<a href="somesite">Click here</a>
Comme vous pouvez le constater, il n’a pas de balises html / body. Ce que je veux faire, c'est ajouter des balises HTML et body au-dessus du document.
J'ai essayé d'ajouter une balise HTML avec le code suivant:
var el = doc.CreateElement("html");
var nodes = doc.DocumentNode.ChildNodes;
doc.DocumentNode.RemoveAllChildren();
el.AppendChildren(nodes);
doc.DocumentNode.AppendChild(el);
Mais après cela, un appel doc.DocumentNode.WriteContentTo()
renvoie <html></html>
. Si je change l'ordre d'exécution des dernières lignes:
var el = doc.CreateElement("html");
var nodes = doc.DocumentNode.ChildNodes;
doc.DocumentNode.RemoveAllChildren();
doc.DocumentNode.AppendChild(el);
el.AppendChildren(nodes);
J'ai eu System.StackOverflowException
après le doc.DocumentNode.WriteContentTo()
.
La solution possible peut être quelque chose comme ceci:
doc.LoadHtml("<html>" + doc.DocumentNode.WriteContentTo() + "</html>")
mais ce sera inefficace en raison de la réparation complète du document.
Avez-vous des idées sur la façon dont ce problème peut être résolu efficacement?
Enfin, je l'ai fait au travail. Le premier échantillon ne fonctionnait pas car doc.DocumentNode.ChildNodes
ne renvoie pas la copie de HtmlNodeCollection
, mais la collection de nœuds elle-même. Cela a entraîné la suppression de tous les noeuds de la collection avant de les ajouter à el
. Le code ci-dessous fait le tour:
var el = doc.CreateElement("html");
var nodes = doc.DocumentNode.ChildNodes;
el.AppendChildren(nodes);
doc.DocumentNode.RemoveAllChildren();
doc.DocumentNode.AppendChild(el);