2012-07-20 85 views
3

删除所有空的和不必要的节点的首选方法是什么?例如从HTML中删除所有空白/不必要的节点

<p></p>应该被删除,<font><p><span><br></span></p></font>也应删除(所以BR标签被认为在这种情况下unneccesery)

我将不得不使用某种形式的递归函数的这个?我在想这个可能是:

RemoveEmptyNodes(HtmlNode containerNode) 
{ 
    var nodes = containerNode.DescendantsAndSelf().ToList(); 

     if (nodes != null) 
     { 
      foreach (HtmlNode node in nodes) 
      { 
       if (node.InnerText == null || node.InnerText == "") 
       { 
        RemoveEmptyNodes(node.ParentNode); 
        node.Remove(); 
       } 
      } 
     } 
    } 

但这显然不起作用(stackoverflow例外)。不应该删除您可以添加名称到列表中,并与属性节点

+1

有一个** “空”和“不必要”之间的巨大差异。删除空节点可能会损坏布局。 – 2012-07-20 12:14:30

+0

好吧,所以我最好不要删除空节点? – 2012-07-20 12:17:25

+0

可能不是,没有。另一个原因:如果你真的打算将'img'元素视为空白,我会感到惊讶。 – hvd 2012-07-20 12:20:23

回答

10

标签也不会因为containerNode.Attributes.Count == 0(例如图像)的去除

static List<string> _notToRemove; 

static void Main(string[] args) 
{ 
    _notToRemove = new List<string>(); 
    _notToRemove.Add("br"); 

    HtmlDocument doc = new HtmlDocument(); 
    doc.LoadHtml("<html><head></head><body><p>test</p><br><font><p><span></span></p></font></body></html>"); 
    RemoveEmptyNodes(doc.DocumentNode); 
} 

static void RemoveEmptyNodes(HtmlNode containerNode) 
{ 
    if (containerNode.Attributes.Count == 0 && !_notToRemove.Contains(containerNode.Name) && string.IsNullOrEmpty(containerNode.InnerText)) 
    { 
     containerNode.Remove(); 
    } 
    else 
    { 
     for (int i = containerNode.ChildNodes.Count - 1; i >= 0; i--) 
     { 
      RemoveEmptyNodes(containerNode.ChildNodes[i]); 
     } 
    } 
}