You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

不依赖System.Configuration编程反序列化XML配置文件并获取指定值

解决方案:不依赖System.Configuration反序列化XML配置并获取值

要实现不依赖System.Configuration类库来处理这个XML配置,我们可以用.NET自带的XmlSerializer来完成反序列化,然后通过自定义方法根据名称查找对应配置值。下面是完整的实现步骤:

1. 定义匹配XML结构的实体类

首先我们需要创建与XML节点结构对应的实体类,这样XmlSerializer才能正确映射XML内容:

using System.Collections.Generic;
using System.Xml.Serialization;

// 根节点实体
[XmlRoot("configuration")]
public class Configuration
{
    public Startup startup { get; set; }
    public ApplicationSettings applicationSettings { get; set; }
}

// startup节点实体
public class Startup
{
    public SupportedRuntime supportedRuntime { get; set; }
}

// supportedRuntime节点实体
public class SupportedRuntime
{
    [XmlAttribute("version")]
    public string Version { get; set; }
    
    [XmlAttribute("sku")]
    public string Sku { get; set; }
}

// applicationSettings节点实体
public class ApplicationSettings
{
    [XmlElement("GlobalERP.UI.Properties.Settings")]
    public GlobalERPUISettings GlobalERPSettings { get; set; }
}

// GlobalERP.UI.Properties.Settings节点实体
public class GlobalERPUISettings
{
    [XmlElement("setting")]
    public List<Setting> Settings { get; set; }
}

// 单个setting节点实体
public class Setting
{
    [XmlAttribute("name")]
    public string Name { get; set; }
    
    [XmlAttribute("serializeAs")]
    public string SerializeAs { get; set; }
    
    public string value { get; set; }
}

2. 反序列化XML的方法

接下来写一个通用的反序列化方法,可以从文件或者XML字符串中读取并转换为Configuration对象:

using System.IO;
using System.Xml.Serialization;

public static class ConfigHelper
{
    // 从XML文件反序列化
    public static Configuration DeserializeConfigFromFile(string filePath)
    {
        var serializer = new XmlSerializer(typeof(Configuration));
        using (var reader = new StreamReader(filePath))
        {
            return (Configuration)serializer.Deserialize(reader);
        }
    }

    // 从XML字符串反序列化
    public static Configuration DeserializeConfigFromString(string xmlContent)
    {
        var serializer = new XmlSerializer(typeof(Configuration));
        using (var reader = new StringReader(xmlContent))
        {
            return (Configuration)serializer.Deserialize(reader);
        }
    }
}

3. 根据名称获取配置值的方法

ConfigHelper类中添加一个方法,从反序列化后的Configuration对象中根据setting名称查找对应的值:

public static string GetSettingValue(Configuration config, string settingName)
{
    return config?.applicationSettings?.GlobalERPSettings?.Settings
        ?.FirstOrDefault(s => s.Name.Equals(settingName, StringComparison.OrdinalIgnoreCase))
        ?.value;
}

4. 使用示例

下面是如何使用这些方法的示例:

// 从文件读取配置
var config = ConfigHelper.DeserializeConfigFromFile(@"C:\YourConfigPath\App.config");

// 获取指定配置值
var sqlServerIp = ConfigHelper.GetSettingValue(config, "SQLServerIP");
var sqlUserName = ConfigHelper.GetSettingValue(config, "SQLUserName");
var sqlPassword = ConfigHelper.GetSettingValue(config, "SQLPassword");
var sqlDbName = ConfigHelper.GetSettingValue(config, "SQLDBName");

// 输出结果
Console.WriteLine($"SQLServerIP: {sqlServerIp}");
Console.WriteLine($"SQLUserName: {sqlUserName}");
Console.WriteLine($"SQLPassword: {sqlPassword}");
Console.WriteLine($"SQLDBName: {sqlDbName ?? "空值"}");

注意事项

  • 确保实体类的属性名称、XmlAttribute/XmlElement特性与XML节点/属性完全匹配,否则反序列化会失败
  • 如果XML文件有命名空间,需要在实体类中添加XmlNamespace特性来匹配
  • 方法中使用了StringComparison.OrdinalIgnoreCase来忽略名称的大小写,如果你需要严格匹配,可以去掉这个参数

内容的提问来源于stack exchange,提问作者xxxsenatorxxx

火山引擎 最新活动