不依赖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




