HtmlAgilityPack: comment créer du HTML en retrait?

Donc, je génère du HTML en utilisant HtmlAgilityPack et cela fonctionne parfaitement, mais le texte HTML n’est pas indenté. Je peux cependant obtenir du XML indenté, mais j’ai besoin de HTML. Y a-t-il un moyen?

HtmlDocument doc = new HtmlDocument(); // gen html HtmlNode table = doc.CreateElement("table"); table.Atsortingbutes.Add("class", "tableClass"); HtmlNode tr = doc.CreateElement("tr"); table.ChildNodes.Append(tr); HtmlNode td = doc.CreateElement("td"); td.InnerHtml = "—"; tr.ChildNodes.Append(td); // write text, no indent :( using(StreamWriter sw = new StreamWriter("table.html")) { table.WriteTo(sw); } // write xml, nicely indented but it's XML! XmlWriterSettings settings = new XmlWriterSettings(); settings.OmitXmlDeclaration = true; settings.Indent = true; settings.ConformanceLevel = ConformanceLevel.Fragment; using (XmlWriter xw = XmlTextWriter.Create("table.xml", settings)) { table.WriteTo(xw); } 

Autant que je sache, HtmlAgilityPack ne peut pas faire cela. Mais vous pouvez regarder à travers html Tidy Packs qui sont proposés dans des questions similaires:

  • Html Agility Pack: donnez au code une apparence soignée
  • Quel est le meilleur pack de rangement HTML? Existe-t-il une option dans le pack d’agilité HTML pour rendre la page Web HTML ordonnée?

Non, et c’est un choix “à dessein”. Il existe une grande différence entre XML (ou XHTML, qui est XML, pas HTML) où – la plupart du temps – les espaces ne sont pas une signification spécifique, et HTML.

Ce n’est pas une amélioration si mineure, car la modification des espaces peut modifier la façon dont certains navigateurs affichent le chunk HTML donné, en particulier le HTML malformé (généralement bien géré par la bibliothèque). Et le Pack d’agilité HTML a été conçu pour conserver la façon dont le code HTML est rendu , non pour minimiser la façon dont le balisage est écrit .

Je ne dis pas que ce n’est pas faisable ou tout simplement impossible. Évidemment, vous pouvez convertir en XML et voilà (et vous pourriez écrire une méthode d’extension pour faciliter cela), mais la sortie rendue peut être différente, dans le cas général.

J’ai fait la même expérience même si HtmlAgilityPack est génial pour lire et modifier des fichiers HTML (ou dans mon cas asp), vous ne pouvez pas créer de sortie lisible.

Cependant, j’ai fini par écrire des lignes de code qui fonctionnent pour moi:

Ayant un HtmlDocument nommé “m_htmlDocument”, je crée mon fichier HTML comme suit:

 file = new System.IO.StreamWriter(_sFullPath); if (m_htmlDocument.DocumentNode != null) foreach (var node in m_htmlDocument.DocumentNode.ChildNodes) WriteNode(file, node, 0); 

et

 void WriteNode(System.IO.StreamWriter _file, HtmlNode _node, int _indentLevel) { // check parameter if (_file == null) return; if (_node == null) return; // init ssortingng INDENT = " "; ssortingng NEW_LINE = System.Environment.NewLine; // case: no children if(_node.HasChildNodes == false) { for (int i = 0; i < _indentLevel; i++) _file.Write(INDENT); _file.Write(_node.OuterHtml); _file.Write(NEW_LINE); } // case: node has childs else { // indent for (int i = 0; i < _indentLevel; i++) _file.Write(INDENT); // open tag _file.Write(string.Format("<{0} ",_node.Name)); if(_node.HasAttributes) foreach(var attr in _node.Attributes) _file.Write(string.Format("{0}=\"{1}\" ", attr.Name, attr.Value)); _file.Write(string.Format(">{0}",NEW_LINE)); // childs foreach(var chldNode in _node.ChildNodes) WriteNode(_file, chldNode, _indentLevel + 1); // close tag for (int i = 0; i < _indentLevel; i++) _file.Write(INDENT); _file.Write(string.Format("{1}", _node.Name,NEW_LINE)); } }