C#解析XML层级结构 实现按路径获取配置参数值
任意层级配置参数查询扩展方法实现
你当前的实现硬编码了两层遍历逻辑,无法适配任意深度嵌套,改用递归遍历路径节点即可解决问题,同一份路径匹配逻辑可以同时支撑单值、多值查询需求。
前置说明:首先确保你的
Parameter类定义包含嵌套子参数集合属性,否则无法承载多层XML结构,标准定义如下:[Serializable] public class Parameter { [XmlAttribute("Name")] public string Name { get; set; } [XmlAttribute("Value")] public object Value { get; set; } [XmlElement("Parameter")] public List<Parameter> Parameters { get; set; } = new List<Parameter>(); }
完整实现代码
将以下静态类放到你的项目中即可直接使用扩展方法:
public static class PluginConfigurationExtensions { /// <summary> /// 获取指定路径下第一个匹配参数的值 /// </summary> public static object GetValue(this PluginConfiguration config, string path) { if (config?.Parameters == null || string.IsNullOrWhiteSpace(path)) return string.Empty; var pathSegments = path.Split(new[] {'/'}, StringSplitOptions.RemoveEmptyEntries); var matched = FindMatchedParameters(config.Parameters, pathSegments, 0); return matched.FirstOrDefault()?.Value ?? string.Empty; } /// <summary> /// 获取指定路径下所有匹配参数的值集合 /// </summary> public static List<object> GetValues(this PluginConfiguration config, string path) { if (config?.Parameters == null || string.IsNullOrWhiteSpace(path)) return new List<object>(); var pathSegments = path.Split(new[] {'/'}, StringSplitOptions.RemoveEmptyEntries); var matched = FindMatchedParameters(config.Parameters, pathSegments, 0); return matched.Select(p => p.Value).ToList(); } /// <summary> /// 递归按路径匹配参数节点 /// </summary> private static List<Parameter> FindMatchedParameters(List<Parameter> currentLevelNodes, string[] pathSegments, int currentIndex) { if (currentLevelNodes == null || currentIndex >= pathSegments.Length) return new List<Parameter>(); string currentNodeName = pathSegments[currentIndex]; var sameNameNodes = currentLevelNodes.Where(p => p.Name == currentNodeName).ToList(); // 到达路径最后一段,返回所有同名节点 if (currentIndex == pathSegments.Length - 1) return sameNameNodes; // 未到路径终点,递归进入子节点层继续匹配 var result = new List<Parameter>(); foreach (var node in sameNameNodes) { result.AddRange(FindMatchedParameters(node.Parameters, pathSegments, currentIndex + 1)); } return result; } }
效果验证
针对你给出的XML结构,三个调用场景返回结果完全符合要求:
- 调用
con.GetValue("Dummy")返回值1 - 调用
con.GetValue("Dummy/Test11")返回值2 - 调用
con.GetValues("Dummy/Test12")返回值集合[4,6]
该实现无嵌套层级限制,支持任意深度的参数路径查询,同时自动兼容路径首尾带多余斜杠、空路径、空配置等异常输入,不会抛出运行时错误。
内容的提问来源于stack exchange,提问作者Behnam Faghih
相关产品推荐
相关产品推荐

