【问题标题】:Remove all empty/unnecessary nodes from HTML从 HTML 中删除所有空/不必要的节点
【发布时间】:2017-07-14 23:06:51
【问题描述】:

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

<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 异常)。

【问题讨论】:

  • “空”和“不必要”之间存在巨大的区别。删除空节点可能会破坏布局。
  • 好的,所以我最好不要删除空节点?
  • 可能不会,不。另一个原因:如果您真的打算将 img 元素视为空,我会感到惊讶。
  • 我明白你的意思。我在想,例如为图像添加例外会很容易

标签: c# html-agility-pack


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-01-27
    • 1970-01-01
    • 2014-12-26
    • 2019-01-07
    • 1970-01-01
    • 2018-06-20
    • 2021-12-21
    • 1970-01-01
    • 2014-07-14
    相关资源
    最近更新 更多