2011-05-09 2 views
5

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

HtmlDocument doc = new HtmlDocument(); 

// gen html 
HtmlNode table = doc.CreateElement("table"); 
table.Attributes.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); 
} 

Répondre

3

Pour autant que je sache, HtmlAgilityPack ne peut pas faire cela. Mais vous pouvez regarder par paquets bien rangé html qui sont proposées dans des questions similaires:

+0

On dirait que c'est vrai, besoin d'une autre lib pour résoudre une telle tâche simple. HtmlAgilityPack a sûrement besoin de cette amélioration mineure. –

+0

Donc, il n'y a aucun moyen de ne pas cracher HTML réduit au minimum? (ie le HTML qui sort du pack d'agilité n'est pas lisible, tout est condensé sur une ligne, il n'y a pas moyen d'insérer des sauts de ligne ou des tabulations juste pour le rendre lisible?) – BrainSlugs83

5

Non, et c'est un choix "par la conception". Il y a 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.

Cela ne constitue pas une amélioration mineure, car la modification des espaces peut modifier la manière dont certains navigateurs affichent un fragment HTML donné, en particulier un HTML malformé (en général bien géré par la bibliothèque). Et le Html Agility Pack a été conçu pour garder la façon dont le HTML est rendu, et non pour minimiser la façon dont le balisage est écrit. Je ne dis pas que ce n'est pas faisable ou simplement impossible. Évidemment, vous pouvez convertir en XML et voilà (et vous pourriez écrire une méthode d'extension pour rendre cela plus facile) mais la sortie rendue peut être différente, dans le cas général.

+0

Eh bien, évidemment je ne suis pas expert en HTML, mais la conversion en XML ne fonctionne pas comme je le souhaite. J'utilisais linq en XML pour générer html, mais je suis passé à HAP à cause de ces différences subtiles de XML et HTML. Par exemple. je ne peux pas sortir l'entité HTML — il est transformé en & mdash; . En tous cas, merci pour l'info! –

+0

'la plupart du temps - les espaces blancs n'ont pas de signification spécifique 'n'est correct que pour les machines, pas humaines, nous avons besoin d'espace pour visualiser et comprendre ce qui est écrit. –

2

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

Cependant, j'ai fini par écrit quelques lignes de code qui travaillent pour moi:

Avoir 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 
     string INDENT = " "; 
     string 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("</{0}>{1}", _node.Name,NEW_LINE)); 
     } 
    } 
Questions connexes