2011-05-09 57 views
5

所以,我使用HtmlAgilityPack生成html,它的工作完美,但HTML文本不缩进。不过,我可以使用缩进的XML,但我需要HTML。有没有办法?HtmlAgilityPack:如何创建缩进的HTML?

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

回答

3

据我所知,HtmlAgilityPack无法做到这一点。但是,你可以看看,通过它在类似的问题提出的HTML整齐包:

+0

看起来这是真的,需要另一个lib来解决这么简单的任务。 HtmlAgilityPack肯定需要这个小小的改进。 – 2011-05-10 11:29:16

+0

那么,有没有办法让它不吐出最小化的HTML? (即敏捷包出来的HTML是不可读的,它全部压缩在一行上,没有办法插入换行符或制表符来使其可读?) – BrainSlugs83 2015-07-08 23:09:07

5

没有,这是一个“设计”的选择。 XML(或XHTML,它是XML,而不是HTML)与大多数时间 - 空格没有特定意义 - 和HTML之间存在很大差异。

这不是一个小小的改进,因为改变空格可以改变某些浏览器渲染给定HTML块的方式,尤其是格式不正确的HTML(通常可以很好地处理该库)。 Html Agility Pack旨在保持HTML的格式为呈现,而不是将标记为的方式写成

我并不是说这不可行或不可能。显然你可以转换为XML和voilà(并且你可以编写一个扩展方法来使这更简单),但是在一般情况下,渲染输出可能不同。

+0

好吧,显然我不是HTML专家,但是转换为XML并不按照我希望的方式工作。我使用linq来生成html,但是由于XML和HTML的细微差别而转换为HAP。例如。我无法输出— HTML实体它已转换为& mdash; 。无论如何,感谢您的信息! – 2011-05-11 19:12:19

+0

'大多数时候 - 空格没有特定的含义'仅对机器而非人类正确,我们需要空白来可视化和理解所写的内容。 – 2016-01-02 07:59:12

2

即使HtmlAgilityPack非常适合阅读和修改Html(或者在我的情况下为asp)文件,但您无法创建可读输出,我也做了相同的体验。

不过,我结束了在编写一些代码行,其工作对我来说:

有一个名为“m_htmlDocument”创建我的HTML文件,如下所示的HTMLDocument:

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

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