从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
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
{
// 静态变量,用于存储数据
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]);
}
}
}
}
}`
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!