Как подстроить / добавить корневой элемент в HtmlAgilityPack?

c# html html-agility-pack

Вопрос

Предположим, у меня есть следующий код HTML:

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

Как вы можете видеть, в нем нет тегов html / body. Я хочу добавить теги html и body поверх документа.

Я попытался добавить html-тег со следующим кодом:

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

Но после этого вызов doc.DocumentNode.WriteContentTo() возвращает <html></html> . Если я изменил порядок выполнения последних строк:

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

Я получил System.StackOverflowException после doc.DocumentNode.WriteContentTo() .

Возможное решение может быть примерно таким:

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

но это будет неэффективно из-за полной репарации документа.

Есть ли у вас какие-либо идеи, как эта проблема может быть решена эффективно?

Принятый ответ

Наконец, я заработал. Первый образец не работал, потому что doc.DocumentNode.ChildNodes возвращает не копию HtmlNodeCollection , а сам узел. Это привело к удалению всех узлов из коллекции, прежде чем добавлять их в el . Код ниже делает трюк:

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


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему