C# XML配置文件读写类(用于程序配置保存)
以前一直在用INI的方式进行程序的配置保存,也挺方便的。
为了更好的扩展性,今天写了个用xml的方式进行配置文件的读写。
调用方式
- //初始化并指定文件路径
- XmlConfigUtil util = new XmlConfigUtil("C:\\1.xml");
- //写入要保存的值以及路径(System、Menu.....都是路径) params string[] 的方式
- util.Write("testValue", "System", "Menu");
- //读取System/Menu下的值
- Console.WriteLine(util.Read("System", "Menu"));
文件路径存在则正常读取,不存在则自动创建。
源码
以下是 XmlConfigUtil 的源码,本文将随时更新。
- /// <summary>
- /// 说明:程序配置保存帮助类 for XML
- /// 更新:http://www.wxzzz.com/1352.html
- /// </summary>
- public class XmlConfigUtil
- {
- #region 全局变量
- string _xmlPath; //文件所在路径
- #endregion
- #region 构造函数
- /// <summary>
- /// 初始化一个配置
- /// </summary>
- /// <param name="xmlPath">配置所在路径</param>
- public XmlConfigUtil(string xmlPath)
- {
- _xmlPath = Path.GetFullPath(xmlPath);
- }
- #endregion
- #region 公有方法
- /// <summary>
- /// 写入配置
- /// </summary>
- /// <param name="value">写入的值</param>
- /// <param name="nodes">节点</param>
- public void Write(string value, params string[] nodes)
- {
- //初始化xml
- XmlDocument xmlDoc = new XmlDocument();
- if (File.Exists(_xmlPath))
- xmlDoc.Load(_xmlPath);
- else
- xmlDoc.LoadXml("<XmlConfig />");
- XmlNode xmlRoot = xmlDoc.ChildNodes[0];
- //新增、编辑 节点
- string xpath = string.Join("/", nodes);
- XmlNode node = xmlDoc.SelectSingleNode(xpath);
- if (node == null) //新增节点
- {
- node = makeXPath(xmlDoc, xmlRoot, xpath);
- }
- node.InnerText = value;
- //保存
- xmlDoc.Save(_xmlPath);
- }
- /// <summary>
- /// 读取配置
- /// </summary>
- /// <param name="nodes">节点</param>
- /// <returns></returns>
- public string Read(params string[] nodes)
- {
- XmlDocument xmlDoc = new XmlDocument();
- if (File.Exists(_xmlPath) == false)
- return null;
- else
- xmlDoc.Load(_xmlPath);
- string xpath = string.Join("/", nodes);
- XmlNode node = xmlDoc.SelectSingleNode("/XmlConfig/" + xpath);
- if (node == null)
- return null;
- return node.InnerText;
- }
- #endregion
- #region 私有方法
- //递归根据 xpath 的方式进行创建节点
- static private XmlNode makeXPath(XmlDocument doc, XmlNode parent, string xpath)
- {
- // 在XPath抓住下一个节点的名称;父级如果是空的则返回
- string[] partsOfXPath = xpath.Trim('/').Split('/');
- string nextNodeInXPath = partsOfXPath.First();
- if (string.IsNullOrEmpty(nextNodeInXPath))
- return parent;
- // 获取或从名称创建节点
- XmlNode node = parent.SelectSingleNode(nextNodeInXPath);
- if (node == null)
- node = parent.AppendChild(doc.CreateElement(nextNodeInXPath));
- // 加入的阵列作为一个XPath表达式和递归余数
- string rest = String.Join("/", partsOfXPath.Skip(1).ToArray());
- return makeXPath(doc, node, rest);
- }
- #endregion
- }