如何使用C#移除字符串中冗余的<div>和</div>标签
C# 清理HTML中冗余嵌套
标签的方案
要解决这个问题,不建议用正则表达式直接处理HTML(HTML的嵌套结构会导致正则无法准确匹配),推荐使用专门的HTML解析库HtmlAgilityPack来处理,以下是具体实现步骤:
1. 安装依赖库
通过NuGet安装HtmlAgilityPack:
Install-Package HtmlAgilityPack # 或者使用.NET CLI dotnet add package HtmlAgilityPack
2. 实现清理逻辑
核心思路是递归遍历HTML节点,识别并移除无属性且仅包含单个子
节点的冗余嵌套层,将子节点直接替换当前节点的位置,直到所有冗余结构被清理。
using HtmlAgilityPack; using System.Linq; public static class HtmlCleaner { public static string RemoveRedundantDivs(string rawHtml) { var htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(rawHtml); // 递归清理节点的方法 void CleanNestedDivs(HtmlNode currentNode) { // 先处理子节点(从后往前遍历,避免节点移除导致索引错乱) for (int i = currentNode.ChildNodes.Count - 1; i >= 0; i--) { CleanNestedDivs(currentNode.ChildNodes[i]); } // 判断当前节点是否为冗余div:无属性,且仅含一个子div节点 if (currentNode.Name.Equals("div", System.StringComparison.OrdinalIgnoreCase) && currentNode.Attributes.Count == 0) { var nonBlankChildren = currentNode.ChildNodes.Where(n => !n.IsWhiteSpace).ToList(); if (nonBlankChildren.Count == 1 && nonBlankChildren[0].Name.Equals("div", System.StringComparison.OrdinalIgnoreCase)) { var childDiv = nonBlankChildren[0]; // 用子div替换当前冗余div currentNode.ParentNode.ReplaceChild(childDiv, currentNode); // 继续检查替换后的子div是否仍有冗余 CleanNestedDivs(childDiv); } } } // 从根节点开始清理 if (htmlDoc.DocumentNode != null) { CleanNestedDivs(htmlDoc.DocumentNode); } // 返回处理后的HTML,保留原有格式 return htmlDoc.DocumentNode.OuterHtml; } // 使用示例 public static void Main() { string originalHtml = @"<div style=""xpto""> <div> <div> <div> <div style=""xpto""> <div> <div> <div style=""xpto""> <div> <div></div> </div> </div> </div> </div> </div> </div> </div> </div> </div>"; string cleanedHtml = RemoveRedundantDivs(originalHtml); System.Console.WriteLine(cleanedHtml); } }
代码说明
- 递归遍历优先处理子节点,确保深层嵌套的冗余div先被清理
- 仅清理无属性且仅含单个子div的节点,避免误删有内容或属性的有效div
- 替换节点后继续递归检查,确保连续嵌套的冗余层被彻底清理
- 保留原HTML的缩进和空白格式,输出结果与目标结构一致
内容的提问来源于stack exchange,提问作者Joffre L A Mota
相关产品推荐
相关产品推荐

