从xml文件中读取配置的项目

在软件运行过程中,有一些运行条件是经常会变化的。在需求变化时,只需要更改一下配置而不需要修改代码。我们有时候把这些配置放在xml文件中。接下来实现一个读取xml配置的项目。

1.新建一个控制台程序,并且新建一个名为"Xml"的文件夹,并且创建一个xml文件用于存储相应的配置:

2.建立一个父类用于给子类继承,包含一个文件路径的字符串数组以及一个获得文件名的方法:

3.建立AppConfig类,它是用来映射你建立的_appConfig.xml文件的。它要继承XmlParent父类并且要给出一个实际的路径来加载文件(这几个标签:XmlElement节点,XmlAttribute一行xml中的每个元素,XmlRoot开始节点,XmlIgnore序列化时忽视,)。

4.建立一个泛型类来存储获得到的xml文件,用泛型可以实现加载多种不同的xml文件,where T : XmlParent, new()这个语句是对T类型的约束,只有实现了XmlParent的类才能使用该泛型类。

5.加载,读取

6.运行结果:

完整代码(因为是控制台程序,所以所有代码都写到Program.cs中):
`
using System.Xml.Serialization;

XmlStorage.Load();

Console.WriteLine($"读取到的IP为{AppConfig.GetSetting("ServerIP")}");
Console.WriteLine($"读取到的Port为{AppConfig.GetSetting("ServerPort")}");

Console.ReadKey();

public class XmlParent
{
///


/// 文件路径
///

[XmlIgnore]
public virtual string[] FilePath { get; set; }

/// <summary>
/// 获取文件名
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public virtual string GetKey(string filePath)
{
    return Path.GetFileName(filePath);
}

}

[XmlRoot("AppConfig")]
public class AppConfig : XmlParent
{

[XmlElement("Setting")]
public List<Setting> SettingList { get; set; } = new List<Setting>();

/// <summary>
/// 文件路径
/// </summary>
[XmlIgnore]
public override string[] FilePath { get; set; } = Directory.GetFiles($"{GetLocalDir()}/Xml/", "_appConfig.xml");

public static string GetLocalDir()
{
    //使用AppDomain获取当前目录
    string dir = AppDomain.CurrentDomain.BaseDirectory;
    string filePath = dir.Substring(0, dir.IndexOf("bin") - 1);

    return filePath;
}


/// <summary>
/// 获取单个配置
/// </summary>
/// <param name="name">配置项名称(Name)</param>
/// <returns></returns>
public static string GetSetting(string name)
{
    return XmlStorage<AppConfig>._data.First().Value.SettingList.FirstOrDefault(s => s.Name == name).Value.Trim();
}

public class Setting
{
    [XmlAttribute("Name")]
    public string Name { get; set; }

    [XmlAttribute("Value")]
    public string Value { get; set; }
}

}

[Serializable]
public class XmlStorage where T : XmlParent, new()
{
// 静态变量,用于存储数据
public static Dictionary<string, T> _data = new Dictionary<string, T>();

// Load方法,加载xml数据存放到静态变量  
public static void Load()
{
    _data.Clear();
    var obj = new T();
    foreach (var filePath in obj.FilePath)
    {
        var fileKey = obj.GetKey(filePath);
        var serializer = new XmlSerializer(typeof(T));
        using (var stream = new FileStream(filePath, FileMode.Open))
        {
            _data.Add(fileKey, (T)serializer.Deserialize(stream));
        }
    }
}

/// <summary>
///  Save方法,将静态变量数据保存到XML  
/// </summary>
/// <param name="key">key为空保存所有,否则按key保存</param>
public static void Save(string key = null)
{
    var serializer = new XmlSerializer(typeof(T));
    var obj = new T();
    foreach (var filePath in obj.FilePath)
    {
        var fileKey = obj.GetKey(filePath);
        if (string.IsNullOrWhiteSpace(key) || key == fileKey)
        {
            using (var stream = new FileStream(filePath, FileMode.Create))
            {
                serializer.Serialize(stream, _data[fileKey]);
            }
        }
    }
}

}`

posted @   talon_a1  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示