Asa_XML.cs 6.8 KB
using System;
using System.Xml;

namespace Asa
{
    public class XML
    {
        private XmlDocument xDoc;
        private XmlNode xRoot;
        private XmlNode xNode;
        private XmlNode xNodeTemp;
        private XmlNamespaceManager nsmgr;
        private string path;
        
        public XML()
        {
            xDoc = new XmlDocument();
            nsmgr = new XmlNamespaceManager(xDoc.NameTable);
        }

        /// <summary>
        /// 错误信息
        /// </summary>
        public string ErrInfo { set; get; }

        /// <summary>
        /// 打开文档
        /// </summary>
        /// <param name="filePath">路径</param>
        /// <returns></returns>
        public bool Open(string filePath)
        {
            try
            {
                path = filePath;
                xDoc.Load(filePath);
                xNode = xRoot = xDoc.LastChild;
                XmlNodeList list = xRoot.SelectNodes("//*");
                foreach (XmlNode n in list)
                {
                    if (n.Prefix.Length > 0)
                        nsmgr.AddNamespace(n.Prefix, n.NamespaceURI);
                }
                return true;
            }
            catch (Exception ex)
            {
                ErrInfo = ex.Message;
                return false;
            }
        }

        /// <summary>
        /// 保存
        /// </summary>
        /// <returns></returns>
        public bool Save()
        {
            if (path == null) return false;
            try
            {
                xDoc.Save(path);
                return true;
            }
            catch(Exception ex)
            {
                ErrInfo = ex.Message;
                return false;
            }
        }

        public void SetRoot()
        {
            xNode = xRoot;
        }

        public bool SetNode(string path)
        {
            xNode = xNode.SelectSingleNode(path, nsmgr);
            return xNode != null;
        }

        public void SetNodeAdd(string path)
        {
            xNodeTemp = xNode.SelectSingleNode(path, nsmgr);
            if (xNodeTemp == null)
            {
                xNode.AppendChild(xDoc.CreateElement(path));
                Save();
                xNode = xNode.SelectSingleNode(path, nsmgr);
            }
            else
            {
                xNode = xNodeTemp;
            }
        }





        public void SelectNode(string path = null)
        {
            if (path == null)
                xNode = xRoot;
            else
                xNode = xNode.SelectSingleNode(path, nsmgr);
        }

        public void SelectNode(int index, string path = null)
        {
            if (path == null)
                xNode = xRoot.ChildNodes[index];
            else
                xNode = xNode.SelectSingleNode(path, nsmgr).ChildNodes[index];
        }

        /// <summary>
        /// 选中Node,如果不存在就添加
        /// </summary>
        /// <param name="path"></param>
        public void SelectAddNode(string path)
        {
            xNode = xNode.SelectSingleNode(path, nsmgr);
            if (xNode == null)
            {
                xRoot.AppendChild(xDoc.CreateElement(path));
                Save();
            }
            xNode = xRoot.SelectSingleNode(path, nsmgr);
        }

        /// <summary>
        /// 获取节点属性
        /// </summary>
        /// <param name="name">属性名称</param>
        /// <param name="path">路径</param>
        /// <returns></returns>
        public string GetAttribute(string name, string path = null)
        {
            if (path == null)
                return ((XmlElement)xNode).GetAttribute(name);
            else
                return ((XmlElement)xNode.SelectSingleNode(path, nsmgr)).GetAttribute(name);
        }

        /// <summary>
        /// 获取节点属性
        /// </summary>
        /// <param name="name">属性名称</param>
        /// <param name="index">索引</param>
        /// <param name="path">路径</param>
        /// <returns></returns>
        public string GetAttribute(string name, int index, string path = null)
        {
            if (path == null)
                return ((XmlElement)xNode.ChildNodes[index]).GetAttribute(name);
            else
                return ((XmlElement)xNode.SelectSingleNode(path, nsmgr).ChildNodes[index]).GetAttribute(name);
        }

        /// <summary>
        /// 获取节点文本
        /// </summary>
        /// <param name="text">文本</param>
        /// <param name="path">路径</param>
        public string GetText(string path = null)
        {
            if (path == null)
                return xNode.InnerText;
            else
            {
                XmlNode n = xNode.SelectSingleNode(path, nsmgr);
                if (n == null)
                    return "";
                else
                    return n.InnerText;
            }
        }

        public int GetCount(string path = null)
        {
            if (path == null)
                return xNode.ChildNodes.Count;
            else
            {
                XmlNode n = xNode.SelectSingleNode(path, nsmgr);
                if (n == null)
                    return 0;
                else
                    return n.ChildNodes.Count;
            }
        }

        /// <summary>
        /// 设置节点文本
        /// </summary>
        /// <param name="text">文本</param>
        /// <param name="path">路径</param>
        public void SetText(string text, string path = null)
        {
            if (path == null)
                xNode.InnerText = text;
            else
                xNode.SelectSingleNode(path, nsmgr).InnerText = text;
        }


        public void SetAttribute(string name, string value, string path = null)
        {
            if (path == null)
                ((XmlElement)xNode).SetAttribute(name, value);
            else
                ((XmlElement)xNode.SelectSingleNode(path, nsmgr)).SetAttribute(name, value);
        }

        public void SetAttribute(string name, string value, int index, string path = null)
        {
            if (path == null)
                ((XmlElement)xNode.ChildNodes[index]).SetAttribute(name, value);
            else
                ((XmlElement)xNode.SelectSingleNode(path, nsmgr).ChildNodes[index]).SetAttribute(name, value);
        }

        public void AddNode(string name, string path = null)
        {
            if (path == null)
                xNode.AppendChild(xDoc.CreateElement(name));
            else
                xNode.SelectSingleNode(path, nsmgr).AppendChild(xDoc.CreateElement(name));
        }

        public void DelChildNode(string path = null)
        {
            if (path == null)
                xNode.RemoveAll();
            else
                xNode.SelectSingleNode(path, nsmgr).RemoveAll();
        }


    }
}