WEB开发网
开发学院WEB开发ASP.NET .net操纵xml文件类(c#) 阅读

.net操纵xml文件类(c#)

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

一直想要写一个操作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}
534
535

Tags:net 操纵 xml

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接