c#操作XML文件的通用方法

c#操作XML文件的通用方法

 
本文导读:我们在编写C#程序时,经常会通过C#访问XML文件,实现对XML文档的读写操作。下面为大家列出了通用的调用方法,大家可以将这些方法放在共用类里,其它的程序共享调用就可以了。

     下面通过一个类将我们平时用c#操作XML文件的通用方法详细的介绍一下,关于asp.net C#操作xml文档实现代码,大家可以参考参考。

 c# 代码
  1                 sing System;
  2 using System.Data;
  3 using System.Configuration;
  4 using System.Web;
  5 using System.Web.Security;
  6 using System.Web.UI;
  7 using System.Web.UI.WebControls;
  8 using System.Web.UI.WebControls.WebParts;
  9 using System.Web.UI.HtmlControls;
 10 using System.Xml;
 11 using System.Collections;
 12 using System.IO;
 13 
 14 
 15 public class XMLHealper
 16 {
 17    构造函数#region 构造函数
 18     public XMLHealper()
 19    {
 20         FilePath = XMLPath.GetXMLPath();
 21         OpenXML();
 22    }
 23    #endregion
 24 
 25    对象定义#region 对象定义
 26 
 27     private XmlDocument xmlDoc = new XmlDocument();
 28    XmlNode xmlnode;
 29    XmlElement xmlelem;
 30 
 31    #endregion
 32 
 33    属性定义#region 属性定义
 34 
 35     private string errorMess;
 36     public string ErrorMess
 37     {
 38         get { return errorMess; }
 39         set { errorMess = value; }
 40     }
 41 
 42     private string filePath;
 43     public string FilePath
 44     {
 45         set { filePath = value; }
 46         get { return filePath; }
 47     }
 48 
 49     #endregion
 50 
 51     加载XML文件,创建操作对象#region 加载XML文件,创建操作对象
 52      /**//// <summary>
 53     /// 加载XML文件,创建操作对象
 54     /// </summary>
 55     public void OpenXML()
 56     {
 57         try
 58         {
 59             if (!string.IsNullOrEmpty(FilePath))
 60             {
 61                 xmlDoc.Load(filePath);
 62             }
 63             else
 64             {
 65                 FilePath = string.Format(@"D:\XMLExample.xml"); //默认路径
 66                 xmlDoc.Load(filePath);
 67             }
 68         }
 69         catch (Exception ex)
 70         {
 71             ErrorMess = ex;
 72         }
 73     }
 74     #endregion
 75 
 76     创建Xml 文档#region 创建Xml 文档
 77     /**//// <summary>
 78     /// 创建一个带有根节点的Xml 文件
 79     /// </summary>
 80     /// <param name="FileName">Xml 文件名称</param>
 81     /// <param name="rootName">根节点名称</param>
 82     /// <param name="Encode">编码方式:gb2312,UTF-8 等常见的</param>
 83     /// <param name="DirPath">保存的目录路径</param>
 84     /// <returns></returns>
 85     public bool CreatexmlDocument(string FileName, string rootName, string Encode)
 86     {
 87         try
 88         {
 89             XmlDeclaration xmldecl;
 90             xmldecl = xmlDoc.CreateXmlDeclaration("1.0", Encode, null);
 91             xmlDoc.AppendChild(xmldecl);
 92             xmlelem = xmlDoc.CreateElement("", rootName, "");
 93             xmlDoc.AppendChild(xmlelem);
 94             xmlDoc.Save(FileName);
 95             return true;
 96         }
 97         catch (Exception e)
 98         {
 99             return false;
100         }
101     }
102     #endregion
103 
104     得到数据表#region 得到数据表
105     /**//// <summary>
106     /// 得到数据表
107     /// </summary>
108     /// <returns></returns>
109     public DataView GetData()
110     {
111         xmlDoc = new XmlDocument();
112         DataSet ds = new DataSet();
113         StringReader read = new StringReader(xmlDoc.SelectSingleNode(FilePath).OuterXml);
114         ds.ReadXml(read);
115         return ds.Tables[0].DefaultView;
116     }
117     #endregion
118 
119     读取指定节点的指定属性值#region 读取指定节点的指定属性值
120     /**//// <summary>
121     /// 功能:
122     /// 读取指定节点的指定属性值
123     /// </summary>
124     /// <param name="strNode">节点名称(相对路径://+节点名称)</param>
125     /// <param name="strAttribute">此节点的属性</param>
126     /// <returns></returns>
127     public string GetXmlNodeValue(string strNode, string strAttribute)
128     {
129         string strReturn = "";
130         try
131         {
132             //根据指定路径获取节点
133             XmlNode xmlNode = xmlDoc.SelectSingleNode(strNode);
134             //获取节点的属性,并循环取出需要的属性值
135             XmlAttributeCollection xmlAttr = xmlNode.Attributes;
136 
137             for (int i = 0; i < xmlAttr.Count; i++)
138             {
139                 if (xmlAttr.Item(i).Name == strAttribute)
140                 {
141                     strReturn = xmlAttr.Item(i).Value;
142                 }
143             }
144         }
145         catch (XmlException xmle)
146         {
147             throw xmle;
148         }
149         return strReturn;
150     }
151     #endregion
152 
153     读取指定节点的值#region 读取指定节点的值
154     /**//// <summary>
155     /// 读取指定节点的值
156     /// </summary>
157     /// <param name="strNode">节点名称</param>
158     /// <returns></returns>
159     public string GetXmlNodeValue(string strNode)
160     {
161         string strReturn = String.Empty;
162         try
163         {
164             //根据路径获取节点
165             XmlNode xmlNode = xmlDoc.SelectSingleNode(strNode);
166             strReturn = xmlNode.InnerText;
167         }
168         catch (XmlException xmle)
169         {
170             System.Console.WriteLine(xmle.Message);
171         }
172         return strReturn;
173     }
174     #endregion
175 
176     获取XML文件的根元素#region 获取XML文件的根元素
177     /**//// <summary>
178     /// 获取XML文件的根元素
179     /// </summary>
180     public XmlNode GetXmlRoot()
181     {
182         return xmlDoc.DocumentElement;
183     }
184     #endregion
185 
186     获取XML节点值#region 获取XML节点值
187     /**//// <summary>
188     /// 获取XML节点值
189     /// </summary>
190     /// <param name="nodeName"></param>
191     /// <returns></returns>
192     public string GetNodeValue(string nodeName)
193     {
194         xmlDoc = new XmlDocument();
195         xmlDoc.Load(FilePath);
196 
197         XmlNodeList xnl = xmlDoc.ChildNodes;
198         foreach (XmlNode xnf in xnl)
199         {
200             XmlElement xe = (XmlElement)xnf;
201             XmlNodeList xnf1 = xe.ChildNodes;
202             foreach (XmlNode xn2 in xnf1)
203             {
204                 if (xn2.InnerText == nodeName)
205                 {
206                     XmlElement xe2 = (XmlElement)xn2;
207                     return xe2.GetAttribute("value");
208                 }
209             }
210         }
211         return null;
212     }
213     #endregion
214 
215 
216     设置节点值#region 设置节点值
217     /**//// <summary>
218     /// 功能:
219     /// 设置节点值
220     /// </summary>
221     /// <param name="strNode">节点的名称</param>
222     /// <param name="newValue">节点值</param>
223     public void SetXmlNodeValue(string xmlNodePath, string xmlNodeValue)
224     {
225         try
226         {
227             //根据指定路径获取节点
228             XmlNode xmlNode = xmlDoc.SelectSingleNode(xmlNodePath);
229             //设置节点值
230             xmlNode.InnerText = xmlNodeValue;
231         }
232         catch (XmlException xmle)
233         {
234             throw xmle;
235         }
236     }
237     #endregion
238 
239     添加父节点#region 添加父节点
240 
241     /**//// <summary>
242     /// 在根节点下添加父节点
243     /// </summary>
244     public void AddParentNode(string parentNode)
245     {
246         XmlNode root = GetXmlRoot();
247         XmlNode parentXmlNode = xmlDoc.CreateElement(parentNode);
248 
249         root.AppendChild(parentXmlNode);
250     }
251     #endregion
252 
253     向一个已经存在的父节点中插入一个子节点#region 向一个已经存在的父节点中插入一个子节点
254     /**//// <summary>
255     /// 向一个已经存在的父节点中插入一个子节点
256     /// </summary>
257     public void AddChildNode(string parentNodePath, string childNodePath)
258     {
259         XmlNode parentXmlNode = xmlDoc.SelectSingleNode(parentNodePath);
260         XmlNode childXmlNode = xmlDoc.CreateElement(childNodePath);
261 
262         parentXmlNode.AppendChild(childXmlNode);
263     }
264     #endregion
265 
266     向一个节点添加属性#region 向一个节点添加属性
267     /**//// <summary>
268     /// 向一个节点添加属性
269     /// </summary>
270     public void AddAttribute(string NodePath, string NodeAttribute)
271     {
272         XmlAttribute nodeAttribute = xmlDoc.CreateAttribute(NodeAttribute);
273         XmlNode nodePath = xmlDoc.SelectSingleNode(NodePath);
274         nodePath.Attributes.Append(nodeAttribute);
275     }
276     #endregion
277 
278     插入一个节点和它的若干子节点#region 插入一个节点和它的若干子节点
279     /**//// <summary>
280     /// 插入一个节点和它的若干子节点
281     /// </summary>
282     /// <param name="NewNodeName">插入的节点名称</param>
283     /// <param name="HasAttributes">此节点是否具有属性,True 为有,False 为无</param>
284     /// <param name="fatherNode">此插入节点的父节点</param>
285     /// <param name="htAtt">此节点的属性,Key 为属性名,Value 为属性值</param>
286     /// <param name="htSubNode"> 子节点的属性, Key 为Name,Value 为InnerText</param>
287     /// <returns>返回真为更新成功,否则失败</returns>
288     public bool InsertNode(string NewNodeName, bool HasAttributes, string fatherNode, Hashtable htAtt, Hashtable htSubNode)
289     {
290         try
291         {
292             xmlDoc.Load(FilePath);
293             XmlNode root = xmlDoc.SelectSingleNode(fatherNode);
294             xmlelem = xmlDoc.CreateElement(NewNodeName);
295             if (htAtt != null && HasAttributes)//若此节点有属性,则先添加属性
296             {
297                 SetAttributes(xmlelem, htAtt);
298                 AddNodes(xmlelem.Name, xmlDoc, xmlelem, htSubNode);//添加完此节点属性后,再添加它的子节点和它们的InnerText
299             }
300             else
301             {
302                 AddNodes(xmlelem.Name, xmlDoc, xmlelem, htSubNode);//若此节点无属性,那么直接添加它的子节点
303             }
304             root.AppendChild(xmlelem);
305             xmlDoc.Save(FilePath);
306             return true;
307         }
308         catch (Exception e)
309         {
310             throw new Exception(e.Message);
311         }
312     }
313     #endregion
314 
315     设置节点属性#region 设置节点属性
316     /**//// <summary>
317     /// 设置节点属性
318     /// </summary>
319     /// <param name="xe">节点所处的Element</param>
320     /// <param name="htAttribute">节点属性,Key 代表属性名称,Value 代表属性值</param>
321     public void SetAttributes(XmlElement xe, Hashtable htAttribute)
322     {
323         foreach (DictionaryEntry de in htAttribute)
324         {
325             xe.SetAttribute(de.Key.ToString(), de.Value.ToString());
326         }
327     }
328     #endregion
329 
330     增加子节点到根节点下#region 增加子节点到根节点下
331     /**//// <summary>
332     /// 增加子节点到根节点下
333     /// </summary>
334     /// <param name="rootNode">上级节点名称</param>
335     /// <param name="xmlDoc">Xml 文档</param>
336     /// <param name="rootXe">父根节点所属的Element</param>
337     /// <param name="SubNodes">子节点属性,Key 为Name 值,Value 为InnerText 值</param>
338     public void AddNodes(string rootNode, XmlDocument xmlDoc, XmlElement rootXe, Hashtable SubNodes)
339     {
340         foreach (DictionaryEntry de in SubNodes)
341         {
342             xmlnode = xmlDoc.SelectSingleNode(rootNode);
343             XmlElement subNode = xmlDoc.CreateElement(de.Key.ToString());
344             subNode.InnerText = de.Value.ToString();
345             rootXe.AppendChild(subNode);
346         }
347     }
348     #endregion
349 
350     //更新
351 
352     设置节点的属性值#region 设置节点的属性值
353     /**//// <summary>
354     /// 功能:
355     /// 设置节点的属性值
356     /// </summary>
357     /// <param name="xmlNodePath">节点名称</param>
358     /// <param name="xmlNodeAttribute">属性名称</param>
359     /// <param name="xmlNodeAttributeValue">属性值</param>
360     public void SetXmlNodeValue(string xmlNodePath, string xmlNodeAttribute, string xmlNodeAttributeValue)
361     {
362         try
363         {
364             //根据指定路径获取节点
365             XmlNode xmlNode = xmlDoc.SelectSingleNode(xmlNodePath);
366 
367             //获取节点的属性,并循环取出需要的属性值
368             XmlAttributeCollection xmlAttr = xmlNode.Attributes;
369             for (int i = 0; i < xmlAttr.Count; i++)
370             {
371                 if (xmlAttr.Item(i).Name == xmlNodeAttribute)
372                 {
373                     xmlAttr.Item(i).Value = xmlNodeAttributeValue;
374                     break;
375                 }
376             }
377         }
378         catch (XmlException xmle)
379         {
380             throw xmle;
381         }
382     }
383 
384     #endregion
385 
386     更新节点#region 更新节点
387     /**//// <summary>
388     /// 更新节点
389     /// </summary>
390     /// <param name="fatherNode">需要更新节点的上级节点</param>
391     /// <param name="htAtt">需要更新的属性表,Key 代表需要更新的属性,Value 代表更新后的值</param>
392     /// <param name="htSubNode">需要更新的子节点的属性表,Key 代表需要更新的子节点名字Name,Value 代表更新后的值InnerText</param>
393     /// <returns>返回真为更新成功,否则失败</returns>
394     public bool UpdateNode(string fatherNode, Hashtable htAtt, Hashtable htSubNode)
395     {
396         try
397         {
398             xmlDoc = new XmlDocument();
399             xmlDoc.Load(FilePath);
400             XmlNodeList root = xmlDoc.SelectSingleNode(fatherNode).ChildNodes;
401             UpdateNodes(root, htAtt, htSubNode);
402             xmlDoc.Save(FilePath);
403             return true;
404         }
405         catch (Exception e)
406         {
407             throw new Exception(e.Message);
408         }
409     }
410     #endregion
411 
412     更新节点属性和子节点InnerText 值#region 更新节点属性和子节点InnerText 值
413     /**//// <summary>
414     /// 更新节点属性和子节点InnerText 值
415     /// </summary>
416     /// <param name="root">根节点名字</param>
417     /// <param name="htAtt">需要更改的属性名称和值</param>
418     /// <param name="htSubNode">需要更改InnerText 的子节点名字和值</param>
419     public void UpdateNodes(XmlNodeList root, Hashtable htAtt, Hashtable htSubNode)
420     {
421         foreach (XmlNode xn in root)
422         {
423             xmlelem = (XmlElement)xn;
424             if (xmlelem.HasAttributes)//如果节点如属性,则先更改它的属性
425             {
426                 foreach (DictionaryEntry de in htAtt)//遍历属性哈希表
427                 {
428                     if (xmlelem.HasAttribute(de.Key.ToString()))//如果节点有需要更改的属性
429                     {
430                         xmlelem.SetAttribute(de.Key.ToString(), de.Value.ToString());//则把哈希表中相应的值Value 赋给此属性Key
431                     }
432                 }
433             }
434             if (xmlelem.HasChildNodes)//如果有子节点,则修改其子节点的InnerText
435             {
436                 XmlNodeList xnl = xmlelem.ChildNodes;
437                 foreach (XmlNode xn1 in xnl)
438                 {
439                     XmlElement xe = (XmlElement)xn1;
440                     foreach (DictionaryEntry de in htSubNode)
441                     {
442                         if (xe.Name == de.Key.ToString())//htSubNode 中的key 存储了需要更改的节点名称,
443                         {
444                             xe.InnerText = de.Value.ToString();//htSubNode中的Value存储了Key 节点更新后的数据
445                         }
446                     }
447                 }
448             }
449         }
450     }
451     #endregion
452 
453 
454     删除一个节点的属性#region 删除一个节点的属性
455     /**//// <summary>
456     /// 删除一个节点的属性
457     /// </summary>
458     public void DeleteAttribute(string NodePath, string NodeAttribute, string NodeAttributeValue)
459     {
460         XmlNodeList nodePath = xmlDoc.SelectSingleNode(NodePath).ChildNodes;
461 
462         foreach (XmlNode xn in nodePath)
463         {
464             XmlElement xe = (XmlElement)xn;
465 
466             if (xe.GetAttribute(NodeAttribute) == NodeAttributeValue)
467             {
468                 xe.RemoveAttribute(NodeAttribute);//删除属性
469             }
470         }
471     }
472 
473     #endregion
474 
475     删除一个节点#region 删除一个节点
476     /**//// <summary>
477     /// 删除一个节点
478     /// </summary>
479     public void DeleteXmlNode(string tempXmlNode)
480     {
481         XmlNode xmlNodePath = xmlDoc.SelectSingleNode(tempXmlNode);
482         xmlNodePath.ParentNode.RemoveChild(xmlNodePath);
483     }
484 
485     #endregion
486 
487     删除指定节点下的子节点#region 删除指定节点下的子节点
488     /**//// <summary>
489     /// 删除指定节点下的子节点
490     /// </summary>
491     /// <param name="fatherNode">制定节点</param>
492     /// <returns>返回真为更新成功,否则失败</returns>
493     public bool DeleteNodes(string fatherNode)
494     {
495         try
496         {
497             xmlDoc = new XmlDocument();
498             xmlDoc.Load(FilePath);
499             xmlnode = xmlDoc.SelectSingleNode(fatherNode);
500             xmlnode.RemoveAll();
501             xmlDoc.Save(FilePath);
502             return true;
503         }
504         catch (XmlException xe)
505         {
506             throw new XmlException(xe.Message);
507         }
508     }
509     #endregion
510 
511 
512     私有函数#region 私有函数
513 
514     private string functionReturn(XmlNodeList xmlList, int i, string nodeName)
515     {
516         string node = xmlList[i].ToString();
517         string rusultNode = "";
518         for (int j = 0; j < i; j++)
519         {
520             if (node == nodeName)
521             {
522                 rusultNode = node.ToString();
523             }
524             else
525             {
526                 if (xmlList[j].HasChildNodes)
527                 {
528                     functionReturn(xmlList, j, nodeName);
529                 }
530                 else
531                 {
532                     break;
533                 }
534             }
535         }
536         return rusultNode;
537 
538 
539     }
540 
541     #endregion
542 
543     保存XML文件#region 保存XML文件
544     /**//// <summary>
545     /// 功能: 
546     /// 保存XML文件
547     /// 
548     /// </summary>
549     public void SavexmlDocument()
550     {
551         try
552         {
553             xmlDoc.Save(FilePath);
554         }
555         catch (XmlException xmle)
556         {
557             throw xmle;
558         }
559     }
560     /**//// <summary>
561     /// 功能: 保存XML文件
562     /// </summary>
563     /// <param name="tempXMLFilePath"></param>
564     public void SavexmlDocument(string tempXMLFilePath)
565     {
566         try
567         {
568             xmlDoc.Save(tempXMLFilePath);
569         }
570         catch (XmlException xmle)
571         {
572             throw xmle;
573         }
574     }
575     #endregion
576 }
577 
578             
View Code
原文地址:https://www.cnblogs.com/omg24/p/4288523.html