You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 19:39:39