| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 | using System;using System.IO;using System.Linq;using System.Xml;namespace OTSIncAReportApp.Controls{    /// <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    }}
 |