从HTML中删除所有空/不必要的节点

3
什么是移除所有空和不必要节点的首选方法?例如,<p></p>应该被移除,<font><p><span><br></span></p></font>也应该被移除(所以在这种情况下br标签被认为是不必要的)。
我需要使用一些递归函数来完成吗? 我想可能会有类似以下的解决方案:
 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
“空”和“不必要”之间有着巨大的区别。删除空节点可能会破坏布局。 - Marc Gravell
好的,那么最好不要删除空节点吗? - Christer William Persson
可能不是,没有吧。另一个原因是:如果您真的打算将img元素视为空的话,我会感到惊讶。 - user743382
我明白你的意思。我认为,例如为图像添加异常处理应该很容易。 - Christer William Persson
1个回答

13

不应该被删除的标签,你可以将它们的名称添加到列表中,具有属性的节点也不会被删除,因为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]);
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接