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

从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; }

///

/// 获取文件名

///

///

///

public virtual string GetKey(string filePath)

{

return Path.GetFileName(filePath);

}

}

[XmlRoot("AppConfig")]

public class AppConfig : XmlParent

{

[XmlElement("Setting")]

public List SettingList { get; set; } = new 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._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 _data = new 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]);

}

}

}

}

}`

💎 相关推荐

QQ微云是什么 QQ微云使用攻略
365app安卓客户端下载

QQ微云是什么 QQ微云使用攻略

📅 08-18 👁️ 1258
中国足球协会官方网站
365bet体育在线注册

中国足球协会官方网站

📅 09-02 👁️ 7784
什么是比喻句(什么是比喻句比喻句是什么意思)
365app安卓客户端下载

什么是比喻句(什么是比喻句比喻句是什么意思)

📅 08-12 👁️ 7617