【转】C#对XML文件的各种操作实现方法

原文:http://www.jb51.net/article/35568.htm

  XML:Extensible Markup Language(可扩展标记语言)的缩写,是用来定义其它语言的一种元语言,其前身是SGML(Standard Generalized

Markup Language,标准通用标记语言)。它没有标签集(tag set),也没有语法规则(grammatical rule),但是它有句法规则(syntax rule)。

任何XML文档对任何类型的应用以及正确的解析都必须是良构的(well-formed),即每一个打开的标签都必须有匹配的结束标签,不得

含有次序颠倒的标签,并且在语句构成上应符合技术规范的要求。XML文档可以是有效的(valid),但并非一定要求有效。所谓有效文档是指其符合其文档

类型定义(DTD)的文档。如果一个文档符合一个模式(schema)的规定,那么这个文档是”模式有效的(schema valid)”。

  XML文件在存储、交换和传输数据信息上有着很方便处理,那么今天这篇文章主要讲一下用C#如何实现对XML文件的基本操作,

如:创建xml文件,增、删、改、查xml的节点信息。所使用的方法很基础,方便易懂(用于自己的学习和记忆只需,同时也希望能够给你带来一些帮助,

如有不合适的地方欢迎大家批评指正)。

  本文的主要模块为:

    ① :生成xml文件

    ② :遍历xml文件的节点信息

    ③ :修改xml文件的节点信息

    ④ :向xml文件添加节点信息

    ⑤ :删除指定xml文件的节点信息

·假设我们需要设计出这样的一个xml文件来存储相应的信息,如下所示:代码如下:

  1. <Computers>
  2. <Computer ID="11111111" Description="Made in China">
  3. <name>Lenovo</name>
  4. <price>5000</price>
  5. </Computer>
  6. <Computer ID="2222222" Description="Made in USA">
  7. <name>IBM</name>
  8. <price>10000</price>
  9. </Computer>
  10. </Computers>

  那么如何生成这个xml文件?又怎么读取这个xml文件的节点信息,以及如何对这个xml文件的节点信息作相应的操作?请看如下代码示例:

  【注:因为我们要使用xml相关的语法和方法,所以一定要引入命名空间 System.Xml】代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Xml;
  6. namespace OperateXML
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. try
  13. {
  14. //xml文件存储路径
  15. string myXMLFilePath = "E:\\MyComputers.xml";
  16. //生成xml文件
  17. GenerateXMLFile(myXMLFilePath);
  18. //遍历xml文件的信息
  19. GetXMLInformation(myXMLFilePath);
  20. //修改xml文件的信息
  21. ModifyXmlInformation(myXMLFilePath);
  22. //向xml文件添加节点信息
  23. AddXmlInformation(myXMLFilePath);
  24. //删除指定节点信息
  25. DeleteXmlInformation(myXMLFilePath);
  26. }
  27. catch (Exception ex)
  28. {
  29. Console.WriteLine(ex.ToString());
  30. }
  31. }
  32. private static void GenerateXMLFile(string xmlFilePath)
  33. {
  34. try
  35. {
  36. //初始化一个xml实例
  37. XmlDocument myXmlDoc = new XmlDocument();
  38. //创建xml的根节点
  39. XmlElement rootElement = myXmlDoc.CreateElement("Computers");
  40. //将根节点加入到xml文件中(AppendChild)
  41. myXmlDoc.AppendChild(rootElement);
  42. //初始化第一层的第一个子节点
  43. XmlElement firstLevelElement1 = myXmlDoc.CreateElement("Computer");
  44. //填充第一层的第一个子节点的属性值(SetAttribute)
  45. firstLevelElement1.SetAttribute("ID", "11111111");
  46. firstLevelElement1.SetAttribute("Description", "Made in China");
  47. //将第一层的第一个子节点加入到根节点下
  48. rootElement.AppendChild(firstLevelElement1);
  49. //初始化第二层的第一个子节点
  50. XmlElement secondLevelElement11 = myXmlDoc.CreateElement("name");
  51. //填充第二层的第一个子节点的值(InnerText)
  52. secondLevelElement11.InnerText = "Lenovo";
  53. firstLevelElement1.AppendChild(secondLevelElement11);
  54. XmlElement secondLevelElement12 = myXmlDoc.CreateElement("price");
  55. secondLevelElement12.InnerText = "5000";
  56. firstLevelElement1.AppendChild(secondLevelElement12);
  57. XmlElement firstLevelElement2 = myXmlDoc.CreateElement("Computer");
  58. firstLevelElement2.SetAttribute("ID", "2222222");
  59. firstLevelElement2.SetAttribute("Description", "Made in USA");
  60. rootElement.AppendChild(firstLevelElement2);
  61. XmlElement secondLevelElement21 = myXmlDoc.CreateElement("name");
  62. secondLevelElement21.InnerText = "IBM";
  63. firstLevelElement2.AppendChild(secondLevelElement21);
  64. XmlElement secondLevelElement22 = myXmlDoc.CreateElement("price");
  65. secondLevelElement22.InnerText = "10000";
  66. firstLevelElement2.AppendChild(secondLevelElement22);
  67. //将xml文件保存到指定的路径下
  68. myXmlDoc.Save(xmlFilePath);
  69. }
  70. catch (Exception ex)
  71. {
  72. Console.WriteLine(ex.ToString());
  73. }
  74. }
  75. private static void GetXMLInformation(string xmlFilePath)
  76. {
  77. try
  78. {
  79. //初始化一个xml实例
  80. XmlDocument myXmlDoc = new XmlDocument();
  81. //加载xml文件(参数为xml文件的路径)
  82. myXmlDoc.Load(xmlFilePath);
  83. //获得第一个姓名匹配的节点(SelectSingleNode):此xml文件的根节点
  84. XmlNode rootNode = myXmlDoc.SelectSingleNode("Computers");
  85. //分别获得该节点的InnerXml和OuterXml信息
  86. string innerXmlInfo = rootNode.InnerXml.ToString();
  87. string outerXmlInfo = rootNode.OuterXml.ToString();
  88. //获得该节点的子节点(即:该节点的第一层子节点)
  89. XmlNodeList firstLevelNodeList = rootNode.ChildNodes;
  90. foreach (XmlNode node in firstLevelNodeList)
  91. {
  92. //获得该节点的属性集合
  93. XmlAttributeCollection attributeCol = node.Attributes;
  94. foreach (XmlAttribute attri in attributeCol)
  95. {
  96. //获取属性名称与属性值
  97. string name = attri.Name;
  98. string value = attri.Value;
  99. Console.WriteLine("{0} = {1}", name, value);
  100. }
  101. //判断此节点是否还有子节点
  102. if (node.HasChildNodes)
  103. {
  104. //获取该节点的第一个子节点
  105. XmlNode secondLevelNode1 = node.FirstChild;
  106. //获取该节点的名字
  107. string name = secondLevelNode1.Name;
  108. //获取该节点的值(即:InnerText)
  109. string innerText = secondLevelNode1.InnerText;
  110. Console.WriteLine("{0} = {1}", name, innerText);
  111. //获取该节点的第二个子节点(用数组下标获取)
  112. XmlNode secondLevelNode2 = node.ChildNodes[1];
  113. name = secondLevelNode2.Name;
  114. innerText = secondLevelNode2.InnerText;
  115. Console.WriteLine("{0} = {1}", name, innerText);
  116. }
  117. }
  118. }
  119. catch (Exception ex)
  120. {
  121. Console.WriteLine(ex.ToString());
  122. }
  123. }
  124. private static void ModifyXmlInformation(string xmlFilePath)
  125. {
  126. try
  127. {
  128. XmlDocument myXmlDoc = new XmlDocument();
  129. myXmlDoc.Load(xmlFilePath);
  130. XmlNode rootNode = myXmlDoc.FirstChild;
  131. XmlNodeList firstLevelNodeList = rootNode.ChildNodes;
  132. foreach (XmlNode node in firstLevelNodeList)
  133. {
  134. //修改此节点的属性值
  135. if (node.Attributes["Description"].Value.Equals("Made in USA"))
  136. {
  137. node.Attributes["Description"].Value = "Made in HongKong";
  138. }
  139. }
  140. //要想使对xml文件所做的修改生效,必须执行以下Save方法
  141. myXmlDoc.Save(xmlFilePath);
  142. }
  143. catch (Exception ex)
  144. {
  145. Console.WriteLine(ex.ToString());
  146. }
  147. }
  148. private static void AddXmlInformation(string xmlFilePath)
  149. {
  150. try
  151. {
  152. XmlDocument myXmlDoc = new XmlDocument();
  153. myXmlDoc.Load(xmlFilePath);
  154. //添加一个带有属性的节点信息
  155. foreach (XmlNode node in myXmlDoc.FirstChild.ChildNodes)
  156. {
  157. XmlElement newElement = myXmlDoc.CreateElement("color");
  158. newElement.InnerText = "black";
  159. newElement.SetAttribute("IsMixed", "Yes");
  160. node.AppendChild(newElement);
  161. }
  162. //保存更改
  163. myXmlDoc.Save(xmlFilePath);
  164. }
  165. catch (Exception ex)
  166. {
  167. Console.WriteLine(ex.ToString());
  168. }
  169. }
  170. private static void DeleteXmlInformation(string xmlFilePath)
  171. {
  172. try
  173. {
  174. XmlDocument myXmlDoc = new XmlDocument();
  175. myXmlDoc.Load(xmlFilePath);
  176. foreach (XmlNode node in myXmlDoc.FirstChild.ChildNodes)
  177. {
  178. //记录该节点下的最后一个子节点(简称:最后子节点)
  179. XmlNode lastNode = node.LastChild;
  180. //删除最后子节点下的左右子节点
  181. lastNode.RemoveAll();
  182. //删除最后子节点
  183. node.RemoveChild(lastNode);
  184. }
  185. //保存对xml文件所做的修改
  186. myXmlDoc.Save(xmlFilePath);
  187. }
  188. catch (Exception ex)
  189. {
  190. Console.WriteLine(ex.ToString());
  191. }
  192. }
  193. }
  194. }

上面的这个例子,首先是通过GenerateXMLFile方法在E盘创建出了我们预想的xml文件;然后通过GetXMLInformation方法对刚刚生成的xml文件进行了信息的读取;

之后通过ModifyXmlInformation方法对xml文件信息作出相应的修改

  1. (<Computer ID="2222222" Description="Made in USA">
  2. 修改成为<Computer ID="2222222" Description="Made in HongKong">);

再之后通过AddXmlInformation方法向xml文件中添加了一个带有属性值的color节点;

最后通过DeleteXmlInformation方法将刚刚添加上的color节点删除掉。至此完成了对xml文件的基本操作:创建、读取、修改、添加、删除。

【注1:想要将对xml文件所做的任何修改生效的话,必须调用Save方法,否则我们所做的修改不会保存】

【注2:我们在创建节点的时候用的是XmlElement,但是读取节点信息的时候却用的是XmlNode,这里强调一点:XmlElement是XmlNode的继承,可以调用更多的方法

    实现相应所需的功能】

  最后简单集中的总结一下对xml进行操作的基本方法,如下所示:

  1. //所需要添加的命名空间
  2.     using System.Xml;
  3.     //初始化一个xml实例
  4.     XmlDocument xml=new XmlDocument();
  5.     //导入指定xml文件
  6.     xml.Load(“xml文件路径path”);
  7.     //指定一个节点
  8.     XmlNode root=xml.SelectSingleNode("节点名称");
  9.     //获取节点下所有直接子节点
  10.     XmlNodeList childlist=root.ChildNodes;
  11.     //判断该节点下是否有子节点
  12.     root.HasChildNodes;
  13.     //获取同名同级节点集合
  14.     XmlNodeList nodelist=xml.SelectNodes("节点名称");
  15.     //生成一个新节点
  16.     XmlElement node=xml.CreateElement("节点名称");
  17.     //将节点加到指定节点下,作为其子节点
  18.     root.AppendChild(node);
  19.     //将节点加到指定节点下某个子节点前
  20.     root.InsertBefore(node,root.ChildeNodes[i]);
  21.     //为指定节点的新建属性并赋值
  22.     node.SetAttribute("id","11111");
  23.     //为指定节点添加子节点
  24.     root.AppendChild(node);
  25.     //获取指定节点的指定属性值
  26.     string id=node.Attributes["id"].Value;
  27.     //获取指定节点中的文本
  28.     string content=node.InnerText;
  29.     //保存XML文件
  30.     xml.Save(“xml文件存储的路径path”);

【转】C#对XML文件的各种操作实现方法的更多相关文章

  1. php对xml文件进行CURD操作

    XML是一种数据存储.交换.表达的标准: - 存储:优势在于半结构化,可以自定义schema,相比关系型二维表,不用遵循第一范式(可以有嵌套关系): - 交换:可以通过schema实现异构数据集成: ...

  2. 【JAVA使用XPath、DOM4J解析XML文件,实现对XML文件的CRUD操作】

    一.简介 1.使用XPath可以快速精确定位指定的节点,以实现对XML文件的CRUD操作. 2.去网上下载一个“XPath帮助文档”,以便于查看语法等详细信息,最好是那种有很多实例的那种. 3.学习X ...

  3. 转载 VC轻松解析XML文件 - CMarkup类的使用方法

    VC轻松解析XML文件 - CMarkup类的使用方法http://www.cctry.com/thread-3866-1-1.html VC解析XML文件的工具有很多,CMarkup, tinyXM ...

  4. 如何在Mybatis的xml文件调用java类的方法

    在mybatis的映射xml文件调用java类的方法:使用的是OGNL表达式,表达式格式为:${@prefix@methodName(传递参数名称)} 1.如下代码所示:方法必须为静态方法:以下我只是 ...

  5. 如何:执行大型 XML 文档的流式转换 大XML文件解析入库的一个方法

    w Parsing Huge XML Files Incrementally http://pclib.github.io/safari/program/python-cookbook/Text/ch ...

  6. 【JAVA解析XML文件实现CRUD操作】

    一.简介. 1.xml解析技术有两种:dom和sax 2.dom:Document Object Model,即文档对象模型,是W3C组织推荐的解析XML的一种方式. sax:Simple API f ...

  7. java代码用dom4j解析xml文件的简单操作

    时间: 2016/02/17 目标:为telenor的ALU Femto接口写一个采集xml文件并解析出locationName标签里的值,然后更新到数据库中. 从网上搜了下,有四种常用的解析xml的 ...

  8. XML文件的一些操作

    XML 是被设计用来传输和存储数据的, XML 必须含有且仅有一个 根节点元素(没有根节点会报错) 源码下载 http://pan.baidu.com/s/1ge2lpM7 好了,我们 先看一个 XM ...

  9. Xml文件并发读写的解决方法

    之前对xml的操作大都是通过XmlDocument对象来进行,但是这样的情况对于没有并发的是非常合适的,最近遇到了并发读写xml文件的情况.通过文件流来操作能解决大部分的并发情况,对于极端的情况会有问 ...

随机推荐

  1. mysql 多表查询 左联 去重方法

    1.数据库中的两张表: 2.传统左联查询数据结果如下: 3.替换查询语句可得到去重数据结果:

  2. mongo之map-reduce笔记

    package com.sy.demo; import com.mongodb.MongoClient; import com.mongodb.client.FindIterable; import ...

  3. 极路由U-boot解锁刷root固件教程,root后可刷华硕、如意云等多种固件,附赠全套刷软

    9008正式版固件将会封堵此漏洞,想root的同学尽快了.安装新工具箱里的root保留,可升级官方最新固件并保留root. 此方法并非本人原创,只是将root的过程和经验做个总结,比较适合菜鸟做参考, ...

  4. Azure VM从ASM迁移到ARM(二)

    在一中讨论了通过Azure平台的工具进行迁移的方案. 本文将讨论另外一种迁移方式.通过磁盘复制的方式,把部分VM迁移到ARM的Managed Disk模式. 一.  获得ASM中Disk的信息 在管理 ...

  5. PCIe相关的操作命令

    1.lspci        --显示列举系统目前的pcie设备    43:00.0 Class 0004: Device 104c:b800 (rev 01)    //netra设备 设备编号 ...

  6. Thread之三:Thread Join()的用法

    一.join用法 join()和wait()不会释放锁,join()是Thread的方法,wait()是Object的方法 1.join方法定义在Thread类中,则调用者必须是一个线程 例如: Th ...

  7. 转:InnoDB Crash Recovery 流程源码实现分析

    此文章转载给登博的文章,给大家分享 InnoDB Crash Recovery 流程源码实现分析 Crash Recovery问题 本文主要分析了InnoDB整个crash recovery的源码处理 ...

  8. 侯捷STL学习(三)--分配器测试

    第七节:分配器测试 标准的分配器Allocator,#include<ext/...>都是拓展的 可以用不同的分配器测试同一容器 分配器allocate() & deallocat ...

  9. Word中调整编号和文字的间距

    鼠标放在节文字上,不用选择该级别的所有节点,直接在某一节上右键-段落-制表位-默认制表位-设置1字符或其它.完成后该级别所有节的格式都自动调整,不用一个个调整. 但是设置其它段落格式还是需要在菜单上选 ...

  10. SQLServer数据库中开启CDC导致事务日志空间被占满的原因

    SQLServer数据库中开启CDC导致事务日志空间被占满的原因 转载  2017-04-01   投稿:mrr    我要评论 这篇文章主要介绍了SQLServer数据库中开启CDC导致事务日志空间 ...