using System;
using System.IO;
using System.Linq;
using System.Xml;
namespace OTSIncAReportApp.Controls
{
    /// 
    /// XML操作类
    /// 
    public class XmlConfigUtil
    {
        #region 全局变量
        string _xmlPath;        //文件所在路径
        #endregion
        #region 构造函数
        /// 
        /// 初始化一个配置
        /// 
        /// 配置所在路径
        public XmlConfigUtil(string xmlPath)
        {
            _xmlPath = Path.GetFullPath(xmlPath);
        }
        #endregion
        #region 公有方法
        /// 
        /// 写入配置,也可以用来修改
        /// 
        /// 写入的值
        /// 节点
        public void Write(string value, params string[] nodes)
        {
            //初始化xml
            XmlDocument xmlDoc = new XmlDocument();
            if (File.Exists(_xmlPath))
                xmlDoc.Load(_xmlPath);
            else
                xmlDoc.LoadXml("");
            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);
        }
        /// 
        /// 设置节点上属性的值
        /// 
        /// 属性名
        /// 属性值
        /// 选择节点
        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("");
            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("");
            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;
        }
        /// 
        /// 读取配置
        /// 
        /// 节点
        /// 
        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;
        }
        /// 
        /// 删除节点
        /// 
        /// 
        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
    }
}