如何将任意XML读取到通用层级类以实现通用XML查看器
通用XML查看器:XML转自定义层级结构实现
需求说明
需要实现一个通用XML查看器,能将任意有效XML转换为指定的层级格式展示。
示例XML
<Settings> <User Name="Terry" BDay="09-01-1966"> <Spouse> <Name>Jerri</Name> </Spouse> </User> <User Name="Cliff" BDay="10-18-1980"/> </Settings>
期望展示格式
Settings = User = .Name = Terry .BDay = 09-01-1966 Spouse = Name = Jerri User = .Name = Cliff .BDay = 10-18-1980
规则:
- 属性在标签名前加
.标识 - 子节点和属性按层级缩进
已定义的层级类
public class XHierarchy { public string Name { get; set; } public string Value { get; set; } public List<XHierarchy> Items { get; set; } = new List<XHierarchy>(); }
手动构造测试数据时该类可正常工作,但不清楚如何将任意XML文件的数据读取到这个类中,要求方案适配任意有效XML,而非仅特定Schema的XML。
解决方案
利用.NET的System.Xml.Linq命名空间下的XDocument递归解析XML,将节点、属性转换为XHierarchy实例即可实现通用性:
核心解析代码
using System.Xml.Linq; public static class XmlHierarchyConverter { public static XHierarchy ConvertXmlToHierarchy(string xmlContent) { var doc = XDocument.Parse(xmlContent); return ConvertXElementToHierarchy(doc.Root); } public static XHierarchy ConvertXmlFileToHierarchy(string filePath) { var doc = XDocument.Load(filePath); return ConvertXElementToHierarchy(doc.Root); } private static XHierarchy ConvertXElementToHierarchy(XElement element) { var hierarchy = new XHierarchy { Name = element.Name.LocalName, // 仅保留非空白的节点文本内容 Value = string.IsNullOrWhiteSpace(element.Value) ? null : element.Value.Trim() }; // 处理XML属性:属性名称前添加"."标识 foreach (var attr in element.Attributes()) { hierarchy.Items.Add(new XHierarchy { Name = $".{attr.Name.LocalName}", Value = attr.Value }); } // 递归处理子节点 foreach (var childElement in element.Elements()) { hierarchy.Items.Add(ConvertXElementToHierarchy(childElement)); } return hierarchy; } }
代码说明
- 递归遍历:通过递归方法处理所有层级的XML节点,适配任意深度的XML结构
- 属性适配:将XML属性转换为名称带
.的XHierarchy项,符合展示规则 - 文本处理:仅保留节点的非空白文本内容,避免无效空值
- 通用性保障:仅依赖XML的基础节点/属性结构,不绑定任何特定Schema,支持所有有效XML
后续扩展
解析得到XHierarchy实例后,可编写递归遍历方法,按照缩进规则输出格式化文本,即可得到期望的展示效果。
内容的提问来源于stack exchange,提问作者Stephen Lee Parker
相关产品推荐
相关产品推荐

