zoukankan      html  css  js  c++  java
  • .net操纵xml文件类(c#)

    一直想要写一个操作XML文件的类,今天在网上找了一下,找到一个已写的差不多的类,对其进行扩展与修改,最终成了以下代码,供新手参考参考.
    //
    在此类中用到了XML事件.此类中对于节点的查找必需用xpath表达式,如果你对xpath表达式不了解可以查看我收藏的另外一篇文章:+XML文件操作:[学习xpath]XPath最通俗的教程+

      1using System;
      2using System.Xml;
      3using System.Web;
      4namespace solucky
      5{
      6    /**//// <summary>
      7    /// 必需用XPATH表达式来获取相应节点
      8    /// 关于xpath可以参见:
      9    /// </summary>
     10    public class MyXml
     11    {
     12        变量#region 变量
     13        /**//// <summary>
     14        /// xml文件所在路径类型
     15        /// </summary>
     16        /// <remarks>xml文件所在路径类型</remarks>
     17        public enum enumXmlPathType
     18        {   
     19            /**//// <summary>
     20            /// 绝对路径
     21            /// </summary>
     22            AbsolutePath,
     23            /**//// <summary>
     24            /// 虚拟路径
     25            /// </summary>
     26            VirtualPath
     27        }
     28
     29        private string xmlFilePath ;
     30        private enumXmlPathType xmlFilePathType ;
     31        private XmlDocument xmlDoc = new XmlDocument() ;
     32        #endregion
     33
     34
     35        属性#region 属性
     36        /**//// <summary>
     37        /// 文件路径
     38        /// </summary>
     39        /// <remarks>文件路径</remarks>
     40        public string XmlFilePath
     41        {
     42            get
     43            {
     44                return this.xmlFilePath;
     45            }
     46            set
     47            {
     48                xmlFilePath = value ;
     49
     50            }
     51        }
     52
     53        /**//// <summary>
     54        /// 文件路径类型
     55        /// </summary>
     56        public enumXmlPathType XmlFilePathTyp
     57        {
     58            set
     59            {
     60                xmlFilePathType = value ;
     61            }
     62        }
     63        #endregion
     64
     65        构造函数#region 构造函数
     66        /**//// <summary>
     67        ///
     68        /// </summary>
     69        /// <param name="tempXmlFilePath"></param>
     70        public MyXml( string tempXmlFilePath )
     71        {
     72            //
     73            // TODO: 在此处添加构造函数逻辑
     74            //
     75
     76            this.xmlFilePathType = enumXmlPathType.VirtualPath ;
     77            this.xmlFilePath = tempXmlFilePath ;
     78            GetXmlDocument() ;
     79            //xmlDoc.Load( xmlFilePath ) ;
     80        }
     81   
     82        /**//// <summary>
     83        /// 构造函数
     84        /// </summary>
     85        /// <param name="tempXmlFilePath">文件路径</param>
     86        /// <param name="tempXmlFilePathType">类型</param>
     87        public MyXml( string tempXmlFilePath , enumXmlPathType tempXmlFilePathType )
     88        {
     89            //
     90            // TODO: 在此处添加构造函数逻辑
     91            //
     92            this.xmlFilePathType = tempXmlFilePathType ;
     93            this.xmlFilePath = tempXmlFilePath ;
     94            GetXmlDocument() ;
     95        }
     96        #endregion
     97
     98
     99        /**////<summary>
    100        ///获取XmlDocument实体类
    101        ///</summary>   
    102        /// <returns>指定的XML描述文件的一个xmldocument实例</returns>
    103        private XmlDocument GetXmlDocument()
    104        {
    105            XmlDocument doc=null;
    106
    107            if( this.xmlFilePathType == enumXmlPathType.AbsolutePath )
    108            {
    109                doc = GetXmlDocumentFromFile( xmlFilePath ) ;
    110            }
    111            else if( this.xmlFilePathType == enumXmlPathType.VirtualPath )
    112            {
    113                doc = GetXmlDocumentFromFile(HttpContext.Current.Server.MapPath(xmlFilePath)) ;
    114            }
    115            return doc;
    116        }
    117
    118        private XmlDocument GetXmlDocumentFromFile(string tempXmlFilePath)
    119        {
    120            string xmlFileFullPath = tempXmlFilePath ;
    121            xmlDoc.Load(xmlFileFullPath) ;
    122            //定义事件处理
    123            xmlDoc.NodeChanged += new XmlNodeChangedEventHandler(this.nodeUpdateEvent);
    124            xmlDoc.NodeInserted += new XmlNodeChangedEventHandler(this.nodeInsertEvent);
    125            xmlDoc.NodeRemoved += new XmlNodeChangedEventHandler(this.nodeDeleteEvent);
    126            return xmlDoc ;
    127        }
    128
    129        读取指定节点的指定属性值#region 读取指定节点的指定属性值
    130        /**//// <summary>
    131        /// 功能:
    132        /// 读取指定节点的指定属性值   
    133        /// </summary>
    134        /// <param name="strNode">节点名称</param>
    135        /// <param name="strAttribute">此节点的属性</param>
    136        /// <returns></returns>
    137        public string GetXmlNodeAttributeValue(string strNode,string strAttribute)
    138        {
    139            string strReturn = "";
    140            try
    141            {
    142                //根据指定路径获取节点
    143                XmlNode xmlNode = xmlDoc.SelectSingleNode(strNode) ;
    144                if (!(xmlNode==null))
    145                {//获取节点的属性,并循环取出需要的属性值
    146                    XmlAttributeCollection xmlAttr = xmlNode.Attributes ;
    147
    148                    for(int i=0 ;i<xmlAttr.Count; i++)
    149                    {
    150                        if (xmlAttr.Item(i).Name == strAttribute)
    151                        {
    152                            strReturn = xmlAttr.Item(i).Value ;
    153                            break;
    154                        }
    155                    }
    156                }
    157            }
    158            catch(XmlException xmle)
    159            {
    160                throw xmle ;
    161            }
    162            return strReturn ;
    163        }
    164        #endregion
    165
    166
    167        读取指定节点的值#region 读取指定节点的值
    168        /**//// <summary>
    169        /// 功能:
    170        /// 读取指定节点的值   
    171        /// </summary>
    172        /// <param name="strNode">节点名称</param>
    173        /// <returns></returns>
    174        public string GetXmlNodeValue(string strNode)
    175        {
    176            string strReturn = String.Empty ;
    177
    178            try
    179            {
    180                //根据路径获取节点
    181                XmlNode xmlNode = xmlDoc.SelectSingleNode(strNode) ;
    182                if (!(xmlNode==null))
    183                    strReturn = xmlNode.InnerText ;
    184            }
    185            catch(XmlException xmle)
    186            {
    187                throw xmle ;
    188            }
    189            return strReturn ;
    190        }
    191        #endregion
    192
    193        设置节点值#region 设置节点值
    194        /**//// <summary>
    195        /// 功能:
    196        /// 设置节点值       
    197        /// </summary>
    198        /// <param name="strNode">节点的名称</param>
    199        /// <param name="newValue">节点值</param>
    200        public void SetXmlNodeValue(string xmlNodePath,string xmlNodeValue)
    201        {
    202            try
    203            {
    204                //可以批量为符合条件的节点进行付值
    205                XmlNodeList xmlNode=this.xmlDoc.SelectNodes(xmlNodePath);
    206                if (!(xmlNode==null))
    207                {
    208                    foreach(XmlNode xn in xmlNode)
    209                    {
    210                        xn.InnerText = xmlNodeValue ;   
    211                    }
    212                }
    213                /**//*
    214                 * 根据指定路径获取节点
    215                XmlNode xmlNode = xmlDoc.SelectSingleNode(xmlNodePath) ;           
    216                //设置节点值
    217                if (!(xmlNode==null))
    218                    xmlNode.InnerText = xmlNodeValue ;*/               
    219            }
    220            catch(XmlException xmle)
    221            {
    222                throw xmle ;
    223            }
    224        }
    225        #endregion
    226
    227        设置节点的属性值#region 设置节点的属性值
    228        /**//// <summary>
    229        /// 功能:
    230        /// 设置节点的属性值   
    231        /// </summary>
    232        /// <param name="xmlNodePath">节点名称</param>
    233        /// <param name="xmlNodeAttribute">属性名称</param>
    234        /// <param name="xmlNodeAttributeValue">属性值</param>
    235        public void SetXmlNodeAttributeValue(string xmlNodePath,string xmlNodeAttribute,string xmlNodeAttributeValue)
    236        {
    237            try
    238            {
    239                //可以批量为符合条件的节点的属性付值
    240                XmlNodeList xmlNode=this.xmlDoc.SelectNodes(xmlNodePath);
    241                if (!(xmlNode==null))
    242                {
    243                    foreach(XmlNode xn in xmlNode)
    244                    {
    245                        XmlAttributeCollection xmlAttr = xn.Attributes ;
    246                        for(int i=0 ; i<xmlAttr.Count ; i++)
    247                        {
    248                            if ( xmlAttr.Item(i).Name == xmlNodeAttribute )
    249                            {
    250                                xmlAttr.Item(i).Value = xmlNodeAttributeValue;
    251                                break ;
    252                            }
    253                        }   
    254                    }
    255                }
    256                /**//*单个节点
    257                //根据指定路径获取节点
    258                XmlNode xmlNode = xmlDoc.SelectSingleNode(xmlNodePath) ;
    259                if (!(xmlNode==null))
    260                {//获取节点的属性,并循环取出需要的属性值
    261                    XmlAttributeCollection xmlAttr = xmlNode.Attributes ;
    262                    for(int i=0 ; i<xmlAttr.Count ; i++)
    263                    {
    264                        if ( xmlAttr.Item(i).Name == xmlNodeAttribute )
    265                        {
    266                            xmlAttr.Item(i).Value = xmlNodeAttributeValue;
    267                            break ;
    268                        }
    269                    }   
    270                }
    271                */
    272            }
    273            catch(XmlException xmle)
    274            {
    275                throw xmle ;
    276            }
    277        }
    278        #endregion
    279
    280        添加#region 添加
    281        /**//// <summary>
    282        /// 获取XML文件的根元素
    283        /// </summary>
    284        public XmlNode GetXmlRoot()
    285        {
    286            return xmlDoc.DocumentElement ;
    287        }
    288
    289        /**//// <summary>
    290        /// 在根节点下添加父节点
    291        /// </summary>
    292        public void AddParentNode(string parentNode)
    293        {
    294            try
    295            {
    296                XmlNode root = GetXmlRoot() ;
    297                XmlNode parentXmlNode = xmlDoc.CreateElement(parentNode) ;
    298                root.AppendChild(parentXmlNode) ;               
    299            }
    300            catch(XmlException xmle)
    301            {
    302                throw xmle ;
    303            }
    304        }
    305       
    306        /**//// <summary>
    307        /// 向一个已经存在的父节点中插入一个子节点
    308        /// </summary>
    309        /// <param name="parentNodePath">父节点</param>
    310        /// <param name="childNodePath">字节点名称</param>
    311        public void AddChildNode( string parentNodePath,string childnodename )
    312        {
    313            try
    314            {
    315                XmlNode parentXmlNode = xmlDoc.SelectSingleNode(parentNodePath) ;               
    316                if(!((parentXmlNode)==null))//如果此节点存在
    317                {   
    318                    XmlNode childXmlNode =  xmlDoc.CreateElement(childnodename) ;               
    319                    parentXmlNode.AppendChild( childXmlNode ) ;   
    320                }
    321                else{//如果不存在就放父节点添加
    322                    //this.GetXmlRoot().AppendChild(childXmlNode);
    323                }
    324                           
    325            }
    326            catch(XmlException xmle)
    327            {
    328                throw xmle;
    329            }
    330        }
    331       
    332        /**//// <summary>
    333        /// 向一个节点添加属性
    334        /// </summary>
    335        /// <param name="NodePath">节点路径</param>
    336        /// <param name="NodeAttribute">属性名</param>
    337        public void AddAttribute( string NodePath , string NodeAttribute)
    338        {
    339            privateAddAttribute(NodePath,NodeAttribute,"");
    340        }
    341        /**//// <summary>
    342        ///
    343        /// </summary>
    344        /// <param name="NodePath"></param>
    345        /// <param name="NodeAttribute"></param>
    346        /// <param name="NodeAttributeValue"></param>
    347        private void privateAddAttribute( string NodePath , string NodeAttribute,string NodeAttributeValue)
    348        {
    349            try
    350            {
    351                XmlNode nodePath = xmlDoc.SelectSingleNode( NodePath ) ;
    352                if (!(nodePath==null))
    353                {   
    354                    XmlAttribute nodeAttribute = this.xmlDoc.CreateAttribute(NodeAttribute);
    355                    nodeAttribute.Value=NodeAttributeValue;
    356                    nodePath.Attributes.Append(nodeAttribute) ;                       
    357                }
    358            }
    359            catch(XmlException xmle)
    360            {
    361                throw xmle;
    362            }
    363        }
    364        /**//// <summary>
    365        ///  向一个节点添加属性,并付值
    366        /// </summary>
    367        /// <param name="NodePath">节点</param>
    368        /// <param name="NodeAttribute">属性名</param>
    369        /// <param name="NodeAttributeValue">属性值</param>
    370        public void AddAttribute( string NodePath , string NodeAttribute,string NodeAttributeValue)
    371        {
    372            privateAddAttribute(NodePath,NodeAttribute,NodeAttributeValue);
    373        }
    374        #endregion
    375
    376        删除#region 删除
    377        /**//// <summary>
    378        /// 删除节点的一个属性
    379        /// </summary>
    380        /// <param name="NodePath">节点所在的xpath表达式</param>
    381        /// <param name="NodeAttribute">属性名</param>
    382        public void DeleteAttribute( string NodePath , string NodeAttribute)
    383        {           
    384            XmlNodeList nodePath =this.xmlDoc.SelectNodes(NodePath);           
    385            if (!(nodePath==null))
    386            {
    387                foreach (XmlNode tempxn in nodePath)
    388                {
    389                    XmlAttributeCollection xmlAttr = tempxn.Attributes ;
    390                    for(int i=0 ; i<xmlAttr.Count ; i++)
    391                    {
    392                        if ( xmlAttr.Item(i).Name == NodeAttribute)
    393                        {
    394                            tempxn.Attributes.RemoveAt(i);
    395                            break ;
    396                        }
    397                    }
    398                }
    399            }
    400        }
    401       
    402        /**//// <summary>
    403        /// 删除节点,当其属性值等于给定的值时
    404        /// </summary>
    405        /// <param name="NodePath">节点所在的xpath表达式</param>
    406        /// <param name="NodeAttribute">属性</param>
    407        /// <param name="NodeAttributeValue">值</param>
    408        public void DeleteAttribute( string NodePath , string NodeAttribute , string NodeAttributeValue)
    409        {
    410            XmlNodeList nodePath =this.xmlDoc.SelectNodes(NodePath);           
    411            if (!(nodePath==null))
    412            {
    413                foreach (XmlNode tempxn in nodePath)
    414                {
    415                    XmlAttributeCollection xmlAttr = tempxn.Attributes ;
    416                    for(int i=0 ; i<xmlAttr.Count ; i++)
    417                    {
    418                        if ( xmlAttr.Item(i).Name == NodeAttribute && xmlAttr.Item(i).Value==NodeAttributeValue)
    419                        {
    420                            tempxn.Attributes.RemoveAt(i);
    421                            break ;
    422                        }
    423                    }
    424                }
    425            }
    426        }
    427        /**//// <summary>
    428        /// 删除节点
    429        /// </summary>
    430        /// <param name="tempXmlNode"></param>
    431        /// <remarks></remarks>
    432        public void DeleteXmlNode(string tempXmlNode){   
    433            XmlNodeList nodePath =this.xmlDoc.SelectNodes(tempXmlNode);
    434            if (!(nodePath==null))
    435            {
    436                foreach(XmlNode xn in nodePath)
    437                {
    438                    xn.ParentNode.RemoveChild(xn);       
    439                }
    440            }
    441        }
    442
    443        #endregion
    444
    445        XML文档事件#region XML文档事件
    446        /**//// <summary>
    447        ///
    448        /// </summary>
    449        /// <param name="src"></param>
    450        /// <param name="args"></param>
    451        private  void nodeInsertEvent(Object src, XmlNodeChangedEventArgs args)
    452        {
    453            //保存设置
    454            SaveXmlDocument();
    455        }
    456        /**//// <summary>
    457        ///
    458        /// </summary>
    459        /// <param name="src"></param>
    460        /// <param name="args"></param>
    461        private  void nodeDeleteEvent(Object src, XmlNodeChangedEventArgs args)
    462        {
    463            //保存设置
    464            SaveXmlDocument();
    465        }
    466        /**//// <summary>
    467        ///
    468        /// </summary>
    469        /// <param name="src"></param>
    470        /// <param name="args"></param>
    471        private  void nodeUpdateEvent(Object src, XmlNodeChangedEventArgs args)
    472        {
    473            //保存设置
    474            SaveXmlDocument();
    475        }
    476        #endregion
    477
    478        保存XML文件#region 保存XML文件
    479        /**//// <summary>
    480        /// 功能:
    481        /// 保存XML文件
    482        ///
    483        /// </summary>
    484        public void SaveXmlDocument()
    485        {
    486            try
    487            {
    488                //保存设置的结果
    489                if( this.xmlFilePathType == enumXmlPathType.AbsolutePath )
    490                {
    491                    Savexml( xmlFilePath ) ;
    492                }
    493                else if( this.xmlFilePathType == enumXmlPathType.VirtualPath )
    494                {
    495                    Savexml(HttpContext.Current.Server.MapPath(xmlFilePath)) ;
    496                }
    497            }
    498            catch(XmlException xmle)
    499            {
    500                throw xmle;
    501            }
    502        }
    503   
    504        /**//// <summary>
    505        /// 功能:
    506        /// 保存XML文件   
    507        /// </summary>
    508        public void SaveXmlDocument(string tempXMLFilePath)
    509        {
    510            try
    511            {
    512                //保存设置的结果
    513                Savexml(tempXMLFilePath);
    514            }
    515            catch(XmlException xmle)
    516            {
    517                throw xmle;
    518            }
    519        }
    520        /**//// <summary>
    521        ///
    522        /// </summary>
    523        /// <param name="filepath"></param>
    524        private void Savexml(string filepath)
    525        {
    526            xmlDoc.Save(filepath);
    527        }
    528
    529        #endregion
    530
    531    }
    532
    533}

  • 相关阅读:
    如何提高产品规划PPT的能力
    怎样招聘出色的产品经理
    [转]破解VS2005 Team Suite版本180天限制
    [转]基于C#的接口基础教程之二
    [转]基于C#的接口基础教程之一
    数据加密标准(DES)的C#实现(4)
    数据加密标准(DES)的C#实现(3)(将BitConverter.ToString的结果转回byte[])
    ASP.NET自定义控件开发微调控件(NumericUpDown)
    Windows XP Embedded 信息资源
    [转]浅谈Base64编码
  • 原文地址:https://www.cnblogs.com/meiproject/p/754613.html
Copyright © 2011-2022 走看看