2011-05-09 24 views
5

Por lo tanto, estoy generando html usando HtmlAgilityPack y está funcionando perfectamente, pero el texto html no está sangrado. Sin embargo, puedo obtener sangs XML, pero necesito HTML. ¿Hay alguna manera?HtmlAgilityPack: ¿cómo crear HTML con sangría?

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); 
} 

Respuesta

3

Por lo que yo sé, HtmlAgilityPack no pueden hacer esto. Sin embargo, usted podría mirar a través de html paquetes ordenado que se proponen en las preguntas similares:

+0

Parece que es cierto, necesita otra lib para resolver una tarea tan simple. HtmlAgilityPack seguramente necesita esta pequeña mejora. –

+0

Entonces, ¿no hay forma de hacerlo no escupir HTML minimizado? (es decir, el HTML que sale del paquete de agilidad no es legible, está condensado en una sola línea, ¿no hay forma de insertar saltos de línea o pestañas solo para hacerlo legible?) – BrainSlugs83

5

No, y es una opción "de diseño". Existe una gran diferencia entre XML (o XHTML, que es XML, no HTML) donde, la mayoría de las veces, los espacios en blanco no tienen un significado específico y HTML.

Esto no es una mejora tan pequeña, ya que los espacios en blanco cambiantes pueden cambiar la forma en que algunos navegadores rinden un fragmento de HTML dado, especialmente HTML malformado (que en general está bien manejado por la biblioteca). Y el Html Agility Pack fue diseñado para mantener la forma en que el HTML es prestado, no para minimizar la forma en que el marcado es escrito.

No estoy diciendo que no sea factible o simplemente imposible. Obviamente puedes convertir a XML y voilà (y podrías escribir un método de extensión para hacerlo más fácil) pero el resultado representado puede ser diferente, en el caso general.

+0

Bueno, obviamente no soy experto en HTML, pero la conversión a XML no funciona de la manera que deseo. Estaba usando linq para XML para generar html, pero cambié a HAP debido a estas diferencias sutiles de XML y HTML. P.ej. No puedo salida — entidad HTML se ha transformado en & mdash; . ¡De todos modos, gracias por la información! –

+0

'la mayoría de las veces, los espacios en blanco no tienen un significado específico" solo es correcto para máquinas, no para humanos, necesitamos espacio en blanco para visualizar y entender lo que está escrito. –

2

Hice la misma experiencia a pesar de que HtmlAgilityPack es ideal para leer y modificar archivos Html (o en mi caso asp) no se puede crear una salida legible.

Sin embargo, terminé por escrito algunas líneas de código que trabajar para mí:

Tener un HtmlDocument nombrado "m_htmlDocument" Creo mi archivo HTML de la siguiente manera:

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

y

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)); 
     } 
    } 
Cuestiones relacionadas