123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- using System;
- using System.IO;
- using System.Linq;
- using System.Xml;
- namespace OTSIncAReportTemplate
- {
- /// <summary>
- /// XML操作类
- /// </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="AttributeName">属性名</param>
- /// <param name="AttributeValue">属性值</param>
- /// <param name="nodes">选择节点</param>
- public void SetAttribute(string AttributeName, string AttributeValue, 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);
- XmlElement element = (XmlElement)xmlDoc.SelectSingleNode(xpath);
- if (element == null) //新增节点
- {
- element = (XmlElement)makeXPath(xmlDoc, xmlRoot, xpath);
- }
- //设置节点上属性的值
- element.SetAttribute(AttributeName, AttributeValue);
- //保存
- xmlDoc.Save(_xmlPath);
- }
- public string GetAttribute(string AttributeName, 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);
- XmlElement element = (XmlElement)xmlDoc.SelectSingleNode(xpath);
- if (element == null) //新增节点
- {
- element = (XmlElement)makeXPath(xmlDoc, xmlRoot, xpath);
- }
- //设置节点上属性的值
- string retstr = element.GetAttribute(AttributeName);
- //保存
- xmlDoc.Save(_xmlPath);
- return retstr;
- }
- /// <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;
- }
- /// <summary>
- /// 删除节点
- /// </summary>
- /// <param name="nodes"></param>
- public void RemoveNode(params string[] nodes)
- {
- XmlDocument xmlDoc = new XmlDocument();
- if (File.Exists(_xmlPath) == false)
- return;
- else
- xmlDoc.Load(_xmlPath);
- string xpath = string.Join("/", nodes);
- XmlNode node = xmlDoc.SelectSingleNode("/XmlConfig/" + xpath);
- //取得父节点
- string[] father_nodes = new string[nodes.Count() - 1];
- //对父节点进行初始化
- for (int i = 0; i < nodes.Count() - 1; i++)
- {
- father_nodes[i] = (string)nodes[i].Clone();
- }
- string fast_xpath = string.Join("/", father_nodes);
- XmlNode fastnode = xmlDoc.SelectSingleNode("/XmlConfig/" + fast_xpath);
- if (node == null)
- return;
- if (fastnode == null)
- return;
- //使用父节点删除子节点
- fastnode.RemoveChild(node);
- //保存
- xmlDoc.Save(_xmlPath);
- }
- #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
- }
- }
|