在软件运行过程中,有一些运行条件是经常会变化的。在需求变化时,只需要更改一下配置而不需要修改代码。我们有时候把这些配置放在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; }
///
/// 获取文件名
///
///
///
public virtual string GetKey(string filePath)
{
return Path.GetFileName(filePath);
}
}
[XmlRoot("AppConfig")]
public class AppConfig : XmlParent
{
[XmlElement("Setting")]
public List
///
/// 文件路径
///
[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;
}
///
/// 获取单个配置
///
/// 配置项名称(Name)
///
public static string GetSetting(string name)
{
return XmlStorage
}
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
// 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));
}
}
}
///
/// Save方法,将静态变量数据保存到XML
///
/// key为空保存所有,否则按key保存
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]);
}
}
}
}
}`