XML文件工具类

 /// <summary>
    /// XML文件工具类
    /// </summary>
    public class XmlFileTool
    {
        #region 初始化
        //根目录名称
        public static string ROOTNAME = "/PitCoXmlRoot/";

        //XML文件路径
        protected string XmlPath;
        //XML文件rooe节点
        protected string RootName;
        // XML读取类
        protected XmlDocument objXmlDoc = new XmlDocument();
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="strXmlPath"></param>
        /// <param name="strXmlRootName"></param>
        public XmlFileTool(string strXmlPath,string strXmlRootName)
        {
            this.XmlPath = strXmlPath;
            if (!strXmlRootName.EndsWith("/"))
            {
                strXmlRootName += "/";
            }
            if (!strXmlRootName.StartsWith("/"))
            {
                strXmlRootName = "/" + strXmlRootName;
            }
            this.RootName = strXmlRootName;
        }
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="strXmlPath"></param>
        /// <param name="strXmlRootName"></param>
        public XmlFileTool(string strXmlPath)
        {
            this.XmlPath = strXmlPath;
            this.RootName = ROOTNAME;
        }
        #endregion

        #region 常用方法
        #region 读取方法(单个key)
        /// <summary>
        /// 根据大类节点名称、小类节点名称获取指定key的Value值
        /// </summary>
        /// <param name="nodeName">大类节点名称</param>
        /// <param name="subNodeName">小类节点名称</param>
        /// <param name="key">key值</param>
        /// <returns></returns>
        public string GetValueByKeyValue(string nodeName, string subNodeName, string key)
        {
            return GetValueByKeyTag(nodeName, subNodeName, key,"Value");
        }
        /// <summary>
        /// 根据大类节点名称、小类节点名称获取指定key指定TagText的值
        /// </summary>
        /// <param name="nodeName">大类节点名称</param>
        /// <param name="subNodeName">小类节点名称</param>
        /// <param name="key">key值</param>
        /// <param name="tagTextName">XML中指定属性对应的值</param>
        /// <returns></returns>
        public string GetValueByKeyTag(string nodeName, string subNodeName, string key, string tagTextName)
        {
            string returnVlaue = "";

            //初始化XML文档 
            XmlDocument xmlDoc = new XmlDocument();
            XmlReaderSettings settings = new XmlReaderSettings()
            {
                IgnoreComments = true//忽略文档里面的注释
            };
            XmlReader reader = XmlReader.Create(XmlPath, settings);
            xmlDoc.Load(reader);

            XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement

            string strPath = string.Format(RootName + nodeName + "/" + subNodeName + "[@Key=\"{0}\"]", key);
            XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath);  //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.

            if (null != selectXe)
            {
                returnVlaue = selectXe.GetAttribute(tagTextName);
                //XmlNodeList nodeLst = selectXe.GetElementsByTagName(tagTextName);
                //{
                //    if (nodeLst.Count > 0 && null != nodeLst.Item(0))
                //    {
                //        returnVlaue = nodeLst.Item(0).InnerText;
                //    }
                //}
            }

            //读取完成以后就关闭
            reader.Close();
            return returnVlaue;
        }
        /// <summary>
        /// 根据大类节点名称、小类节点名称获取指定key指定TagText的值
        /// </summary>
        /// <param name="nodeName">大类节点名称</param>
        /// <param name="subNodeName">小类节点名称</param>
        /// <param name="key">key值</param>
        /// <param name="tagTextName">XML中指定属性对应的值</param>
        /// <returns></returns>
        public Dictionary<string, string> GetValueByKeyTagLst(string nodeName, string subNodeName, string typeId, List<string> tagTextNameLst)
        {
            //初始化XML文档 
            XmlDocument xmlDoc = new XmlDocument();
            XmlReaderSettings settings = new XmlReaderSettings()
            {
                IgnoreComments = true//忽略文档里面的注释
            };
            XmlReader reader = XmlReader.Create(XmlPath, settings);
            xmlDoc.Load(reader);

            XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement

            string strPath = string.Format(RootName + nodeName + "/" + subNodeName + "[@Key=\"{0}\"]", typeId);
            XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath);  //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.

            Dictionary<string, string> dic = new Dictionary<string, string>();
            if (null != selectXe)
            {
                foreach (var attr in tagTextNameLst)
                {
                    dic[attr] = selectXe.GetAttribute(attr);
                    //XmlNodeList nodeLst = selectXe.GetElementsByTagName(attr);
                    //{
                    //    if (nodeLst.Count > 0 && null != nodeLst.Item(0))
                    //    {
                    //        dic[attr] = nodeLst.Item(0).InnerText;
                    //    }
                    //}

                }
            }

            //读取完成以后就关闭
            reader.Close();
            return dic;
        }

        /// <summary>
        /// 获得指定节点下所有标签及值
        /// </summary>
        /// <param name="nodeName">大类节点名称</param>
        /// <param name="subNodeName">小类节点名称</param>
        /// <param name="key">key值</param>
        /// <returns>未找到节点则返回null</returns>
        public Dictionary<string, string> GetAllValueOfNode(string nodeName, string subNodeName, string key)
        {
            //初始化XML文档 
            XmlDocument xmlDoc = new XmlDocument();
            XmlReaderSettings settings = new XmlReaderSettings()
            {
                IgnoreComments = true//忽略文档里面的注释
            };
            XmlReader reader = XmlReader.Create(XmlPath, settings);
            xmlDoc.Load(reader);
            //读取完成以后就关闭
            reader.Close();
            XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement
            string strPath = string.Format(RootName + nodeName + "/" + subNodeName + "[@Key=\"{0}\"]", key);
            XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath);
            if (selectXe != null)
            {
                Dictionary<string, string> retDic = new Dictionary<string, string>();
                foreach (XmlNode node in selectXe.ChildNodes)
                {
                    retDic.Add(node.Name, node.InnerText);
                }

                return retDic;
            }
            else
                return null;//未找到节点则返回null
        }
        /// <summary>
        /// 获取某个节点下的所有节点的key以及对应的value
        /// </summary>
        /// <param name="nodeName"></param>
        /// <param name="subNodeName"></param>
        /// <returns></returns>
        public Dictionary<string, string> GetAllValueOfNode(string nodeName, string subNodeName)
        {
            //初始化XML文档 
            XmlDocument xmlDoc = new XmlDocument();
            XmlReaderSettings settings = new XmlReaderSettings()
            {
                IgnoreComments = true//忽略文档里面的注释
            };
            XmlReader reader = XmlReader.Create(XmlPath, settings);
            xmlDoc.Load(reader);
            //读取完成以后就关闭
            reader.Close();
            XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement
            string strPath = string.Format(RootName + nodeName + "/" + subNodeName);
            XmlNodeList selectXe = xe.SelectNodes(strPath);
            
            if (selectXe != null && selectXe.Count > 0)
            {
                Dictionary<string, string> retDic = new Dictionary<string, string>();
                foreach (XmlElement xElement in selectXe)
                {
                    retDic.Add(xElement.GetAttribute("Key"), xElement.GetAttribute("Value"));
                }
                return retDic;
            }
            else
                return null;//未找到节点则返回null
        }
        #endregion

        #region 读取方法(多个key)
        /// <summary>
        /// 根据大类节点名称、小类节点名称获取多个key的Value值
        /// </summary>
        /// <param name="nodeName">大类节点名称</param>
        /// <param name="subNodeName">小类节点名称</param>
        /// <param name="keyLst">类型详细ID</param>
        /// <returns></returns>
        public Dictionary<string, string> GetValueByKeyLst(string nodeName, string subNodeName, List<string> keyLst)
        {
            Dictionary<string, string> returnDic = new Dictionary<string, string>();

            //初始化XML文档 
            XmlDocument xmlDoc = new XmlDocument();
            XmlReaderSettings settings = new XmlReaderSettings()
            {
                IgnoreComments = true//忽略文档里面的注释
            };
            XmlReader reader = XmlReader.Create(XmlPath, settings);
            xmlDoc.Load(reader);

            XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement
            //循环处理
            foreach (string key in keyLst)
            {
                string strPath = string.Format(RootName + nodeName + "/" + subNodeName + "[@Key=\"{0}\"]", key);
                XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath);
                //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
                if (null != selectXe)
                {
                    returnDic.Add(key, selectXe.GetAttribute("Value"));
                    //XmlNodeList nodeLst = selectXe.GetElementsByTagName("Value");
                    //{
                    //    if (nodeLst.Count > 0 && null != nodeLst.Item(0))
                    //    {
                    //        returnDic.Add(key, nodeLst.Item(0).InnerText);
                    //    }
                    //}

                }
            }
            //读取完成以后就关闭
            reader.Close();
            return returnDic;
        }
        /// <summary>
        /// 根据大类节点名称、小类节点名称获取多个key的Value值
        /// </summary>
        /// <param name="nodeName">大类节点名称</param>
        /// <param name="subNodeName">小类节点名称</param>
        /// <param name="keyLst">类型详细ID</param>
        /// <returns></returns>
        public Dictionary<string, string> GetValueByKeyLst(string nodeName, string subNodeName, List<string> keyLst, string tagTextName)
        {
            Dictionary<string, string> returnDic = new Dictionary<string, string>();

            //初始化XML文档 
            XmlDocument xmlDoc = new XmlDocument();
            XmlReaderSettings settings = new XmlReaderSettings()
            {
                IgnoreComments = true//忽略文档里面的注释
            };
            XmlReader reader = XmlReader.Create(XmlPath, settings);
            xmlDoc.Load(reader);

            XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement
            //循环处理
            foreach (string key in keyLst)
            {
                string strPath = string.Format(RootName + nodeName + "/" + subNodeName + "[@Key=\"{0}\"]", key);
                XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath);
                //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
                if (null != selectXe)
                {
                    returnDic.Add(key, selectXe.GetAttribute(tagTextName));
                    //XmlNodeList nodeLst = selectXe.GetElementsByTagName(tagTextName);
                    //{
                    //    if (nodeLst.Count > 0 && null != nodeLst.Item(0))
                    //    {
                    //        returnDic.Add(key, nodeLst.Item(0).InnerText);
                    //    }
                    //}

                }
            }
            //读取完成以后就关闭
            reader.Close();
            return returnDic;
        }
        /// <summary>
        /// 根据大类节点名称、小类节点名称获取多个key的Value值
        /// </summary>
        /// <param name="nodeName">大类节点名称</param>
        /// <param name="subNodeName">小类节点名称</param>
        /// <param name="keyLst">类型详细ID</param>
        /// <returns></returns>
        public Dictionary<string, Dictionary<string, string>> GetValueByKeyTagLst(string nodeName, string subNodeName, List<string> keyLst, List<string> tagTextNameLst)
        {
            Dictionary<string, Dictionary<string, string>> returnDic = new Dictionary<string, Dictionary<string, string>>();

            //初始化XML文档 
            XmlDocument xmlDoc = new XmlDocument();
            XmlReaderSettings settings = new XmlReaderSettings()
            {
                IgnoreComments = true//忽略文档里面的注释
            };
            XmlReader reader = XmlReader.Create(XmlPath, settings);
            xmlDoc.Load(reader);

            XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement
            //循环处理
            foreach (string key in keyLst)
            {
                string strPath = string.Format(RootName + nodeName + "/" + subNodeName + "[@Key=\"{0}\"]", key);
                XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath);
                //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
                if (null != selectXe)
                {
                    Dictionary<string, string> dicValue = new Dictionary<string, string>();
                    foreach (var attr in tagTextNameLst)
                    {
                        dicValue[attr] = selectXe.GetAttribute(attr);
                        //XmlNodeList nodeLst = selectXe.GetElementsByTagName(attr);
                        //{
                        //    if (nodeLst.Count > 0 && null != nodeLst.Item(0))
                        //    {
                        //        dicValue[attr] = nodeLst.Item(0).InnerText;
                        //    }
                        //} 
                    }
                    returnDic[key] = dicValue;
                }
            }
            //读取完成以后就关闭
            reader.Close();
            return returnDic;
        }
        #endregion

        #region 保存数据
        /// <summary>
        /// 根据节点ID和Key修改具体值
        /// </summary>
        /// <param name="nodeName">大类节点名称</param>
        /// <param name="subNodeName">小类节点名称</param>
        /// <param name="typeId">类型详细ID</param> 
        /// <param name="updValue">修改值</param>
        public  void SaveValueByKey(string nodeName, string subNodeName, string key, string updValue)
        {
            //初始化XML文档 
            XmlDocument xmlDoc = new XmlDocument();
            XmlReaderSettings settings = new XmlReaderSettings()
            {
                IgnoreComments = true//忽略文档里面的注释
            };
            XmlReader reader = XmlReader.Create(XmlPath, settings);
            xmlDoc.Load(reader);

            XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement

            string strPath = string.Format(RootName + nodeName + "/" + subNodeName + "[@Key=\"{0}\"]", key);
            XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath);  //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.

            if (null != selectXe)
            {
                //修改值
                selectXe.SetAttribute("Value", updValue);
                 
                //读取完成以后就关闭
                reader.Close();
                xmlDoc.Save(XmlPath);

            }
            else
            {
                //读取完成以后就关闭
                reader.Close();
                //没有找到的场合,进行新增
                InsertValueByKey(nodeName, subNodeName, key, updValue);
            }
        }
        /// <summary>
        /// 保存数据值
        /// </summary>
        /// <param name="nodeName">节点</param>
        /// <param name="subNodeName">子节点</param>
        /// <param name="key">Key值</param> 
        /// <param name="valueDic">名称和值对应的字典</param>
        public void SetValueByKey(string nodeName, string subNodeName, string key, Dictionary<string, string> valueDic)
        {
            //初始化XML文档 
            XmlDocument xmlDoc = new XmlDocument();
            XmlReaderSettings settings = new XmlReaderSettings()
            {
                IgnoreComments = true//忽略文档里面的注释
            };
            XmlReader reader = XmlReader.Create(XmlPath, settings);
            xmlDoc.Load(reader);

            XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement

            string strPath = string.Format(RootName + nodeName + "/" + subNodeName + "[@Key=\"{0}\"]", key);
            XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath);  //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.

            if (null != selectXe)
            {
                //找到了值就进行修改
                //selectXe.SetAttribute("TypeName", "修改值");
                //读取完成以后就关闭
                reader.Close();
                selectXe.ParentNode.RemoveChild(selectXe);
                //selectXe.RemoveAll();
                xmlDoc.Save(XmlPath);
                //删除之后再新增
                InsertValueByKey(nodeName, subNodeName, key, valueDic);

            }
            else
            {
                //读取完成以后就关闭
                reader.Close();
                //没有找到的场合,进行新增
                InsertValueByKey(nodeName, subNodeName, key, valueDic);
            }
        }


        #endregion

        #region 新增数据
        /// <summary>
        /// 追加节点
        /// </summary>
        /// <param name="nodeName">大类节点名称</param>
        /// <param name="subNodeName">小类节点名称</param>
        /// <param name="key">key值</param> 
        /// <param name="insertValue">修改值</param>
        public void InsertValueByKey(string nodeName, string subNodeName, string key,  string insertValue)
        {

            //初始化XML文档 
            XmlDocument xmlDoc = new XmlDocument();
            XmlReaderSettings settings = new XmlReaderSettings()
            {
                IgnoreComments = true //忽略文档里面的注释
            };
            XmlReader reader = XmlReader.Create(XmlPath, settings);
            xmlDoc.Load(reader);
            //查找nodeName
            XmlNode root = xmlDoc.SelectSingleNode(RootName + nodeName);
            //根节点不存在的场合
            if (null == root)
            {
                root = xmlDoc.SelectSingleNode(RootName.Substring(0, RootName.LastIndexOf("/")));//查找nodeName
                                                                                                 //创建大类节点
                XmlElement bigNode = xmlDoc.CreateElement(nodeName);//创建一个subNodeName 节点   

                //创建子节点
                XmlElement nodeXml = CreateSubElement(xmlDoc, subNodeName, key, insertValue);

                bigNode.AppendChild(nodeXml);
                root.AppendChild(bigNode);//添加到subNodeName节点中  

            }
            else
            {
                //创建子节点
                XmlElement nodeXml = CreateSubElement(xmlDoc, subNodeName, key, insertValue);

                root.AppendChild(nodeXml);//添加到subNodeName节点中  
            }
            //读取完成以后就关闭
            reader.Close();

            xmlDoc.Save(XmlPath);

        }
        /// <summary>
        /// 保存值
        /// </summary>
        /// <param name="nodeName">节点名称</param>
        /// <param name="subNodeName">子节点名称</param>
        /// <param name="key">key值</param> 
        /// <param name="valueDic">名称和值对应的字典</param>
        public void InsertValueByKey(string nodeName, string subNodeName, string key,   Dictionary<string, string> valueDic)
        {

            //初始化XML文档 
            XmlDocument xmlDoc = new XmlDocument();
            XmlReaderSettings settings = new XmlReaderSettings()
            {
                IgnoreComments = true//忽略文档里面的注释
            };
            XmlReader reader = XmlReader.Create(XmlPath, settings);
            xmlDoc.Load(reader);
            //查找nodeName
            XmlNode root = xmlDoc.SelectSingleNode(RootName + nodeName);
            //根节点不存在的场合
            if (null == root)
            {
                root = xmlDoc.SelectSingleNode(RootName.Substring(0, RootName.LastIndexOf("/")));//查找nodeName
                //创建大类节点
                XmlElement bigNode = xmlDoc.CreateElement(nodeName);//创建一个subNodeName 节点   

                //创建子节点
                XmlElement nodeXml = CreateSubElement(xmlDoc, subNodeName, key, valueDic);

                bigNode.AppendChild(nodeXml);
                root.AppendChild(bigNode);//添加到subNodeName节点中  

            }
            else
            {
                //创建子节点
                XmlElement nodeXml = CreateSubElement(xmlDoc, subNodeName, key, valueDic);

                root.AppendChild(nodeXml);//添加到subNodeName节点中  
            }
            //读取完成以后就关闭
            reader.Close();

            xmlDoc.Save(XmlPath);

        }

        /// <summary>
        ///创建子节点
        /// </summary>
        /// <param name="xmlDoc"></param> 
        /// <param name="subNodeName"></param>
        /// <param name="key"></param> 
        /// <param name="insertValue"></param>
        private XmlElement CreateSubElement(XmlDocument xmlDoc, string subNodeName, string key, string insertValue)
        {
            XmlElement nodeXml = xmlDoc.CreateElement(subNodeName);//创建一个subNodeName 节点   
            nodeXml.SetAttribute("Key", key);//设置该节点genre属性    
            nodeXml.SetAttribute("Value", insertValue);//设置该节点genre属性    
            return nodeXml;

        }
        /// <summary>
        /// 创建子节点
        /// </summary>
        /// <param name="xmlDoc"></param>
        /// <param name="subNodeName"></param>
        /// <param name="typeId"></param>
        /// <param name="typeName"></param>
        /// <param name="dic"></param>
        /// <returns></returns>
        private static XmlElement CreateSubElement(XmlDocument xmlDoc, string subNodeName, string key, Dictionary<string, string> valueDic)
        {
            XmlElement nodeXml = xmlDoc.CreateElement(subNodeName);//创建一个subNodeName 节点   
            nodeXml.SetAttribute("Key", key);//设置该节点genre属性   

            foreach (var tagKey in valueDic.Keys)
            {
                nodeXml.SetAttribute(tagKey, valueDic[tagKey]);//设置该节点genre属性   
            }
            return nodeXml;
        }
        #endregion

        #region 删除
        /// <summary>
        /// 删除子节点下指定key的值
        /// </summary>
        /// <param name="nodeName"></param>
        /// <param name="subNodeName"></param>
        /// <param name="typeId"></param>
        public void DelSubNodeByKey(string nodeName, string subNodeName, string key)
        {
            //初始化XML文档 
            XmlDocument xmlDoc = new XmlDocument();
            XmlReaderSettings settings = new XmlReaderSettings()
            {
                IgnoreComments = true//忽略文档里面的注释
            };
            XmlReader reader = XmlReader.Create(XmlPath, settings);
            xmlDoc.Load(reader);

            XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement

            string strPath = string.Format(RootName + nodeName + "/" + subNodeName + "[@Key=\"{0}\"]", key);
            XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath);  //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
            //读取完成以后就关闭
            reader.Close();
            if (null != selectXe)
            {
                selectXe.ParentNode.RemoveChild(selectXe);
                //selectXe.RemoveAll();
                xmlDoc.Save(XmlPath);
            }

        }

        /// <summary>
        /// 删除节点下所有数据
        /// </summary>
        /// <param name="nodeName">节点名称</param>
        public void DelNodeData(string nodeName)
        {
            //初始化XML文档 
            XmlDocument xmlDoc = new XmlDocument();
            XmlReaderSettings settings = new XmlReaderSettings()
            {
                IgnoreComments = true//忽略文档里面的注释
            };
            XmlReader reader = XmlReader.Create(XmlPath, settings);
            xmlDoc.Load(reader);

            XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement

            string strPath = RootName + nodeName;
            XmlNode selectXe = xe.SelectSingleNode(strPath);  //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
            //读取完成以后就关闭
            reader.Close();
            if (null != selectXe)
            {
                //selectXe.ParentNode.RemoveChild(selectXe);
                selectXe.RemoveAll();
                xmlDoc.Save(XmlPath);
            }

        }
        #endregion
        #endregion
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值