C# 用Linq的方式实现对Xml文件的基本操作(创建xml文件、增删改查xml文件节点信息)

爱被打了一巴掌 2022-09-30 11:43 259阅读 0赞

本文的主要模块为:

    ① :生成xml文件

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

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

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

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

  ①:【生成xml文件】假设我们想生成这样的一个xml文件结构,如下所示:

  <? xml version=”1.0” encoding=”utf-8” ?>

-    < Users >

-     < User ID =” 111111 “ >

      < name > EricSun </ name >

       < password > 123456 </ password >

      < description > Hello I’m from Dalian </ description >

     </ User >

-     < User ID =” 222222 “ >

      < name > Ray </ name >

      < password > 654321 </ password >

       < description > Hello I’m from Jilin </ description >

    </ User >

  </ Users >
   用我的上篇文章也能够很容的实现,不过下面我要用Linq to xml的方式实现生成这个xml文件,请看下面代码:

复制代码

  1. 1
  2. using
  3. System;
  4. 2
  5. using
  6. System.Collections.Generic;
  7. 3
  8. using
  9. System.Linq;
  10. 4
  11. using
  12. System.Text;
  13. 5
  14. using
  15. System.Xml.Linq;
  16. 6
  17. 7
  18. namespace
  19. OperateXmlLinq
  20. 8
  21. {
  22. 9
  23. class
  24. Program
  25. 10
  26. {
  27. 11
  28. static
  29. void
  30. Main(
  31. string
  32. [] args)
  33. 12
  34. {
  35. 13
  36. //
  37. xml文件存储路径
  38. 14
  39. string
  40. myXmlPath
  41. =
  42. "
  43. E:\\MyUsers.xml
  44. "
  45. ;
  46. 15
  47. //
  48. 创建xml文件
  49. 16
  50. GenerateXmlFile(myXmlPath);
  51. 17
  52. }
  53. 18
  54. 19
  55. private
  56. static
  57. void
  58. GenerateXmlFile(
  59. string
  60. xmlPath)
  61. 20
  62. {
  63. 21
  64. try
  65. 22
  66. {
  67. 23
  68. //
  69. 定义一个XDocument结构
  70. 24
  71. XDocument myXDoc
  72. =
  73. new
  74. XDocument(
  75. 25
  76. new
  77. XElement(
  78. "
  79. Users
  80. "
  81. ,
  82. 26
  83. new
  84. XElement(
  85. "
  86. User
  87. "
  88. ,
  89. new
  90. XAttribute(
  91. "
  92. ID
  93. "
  94. ,
  95. "
  96. 111111
  97. "
  98. ),
  99. 27
  100. new
  101. XElement(
  102. "
  103. name
  104. "
  105. ,
  106. "
  107. EricSun
  108. "
  109. ),
  110. 28
  111. new
  112. XElement(
  113. "
  114. password
  115. "
  116. ,
  117. "
  118. 123456
  119. "
  120. ),
  121. 29
  122. new
  123. XElement(
  124. "
  125. description
  126. "
  127. ,
  128. "
  129. Hello I'm from Dalian
  130. "
  131. )
  132. 30
  133. ),
  134. 31
  135. new
  136. XElement(
  137. "
  138. User
  139. "
  140. ,
  141. new
  142. XAttribute(
  143. "
  144. ID
  145. "
  146. ,
  147. "
  148. 222222
  149. "
  150. ),
  151. 32
  152. new
  153. XElement(
  154. "
  155. name
  156. "
  157. ,
  158. "
  159. Ray
  160. "
  161. ),
  162. 33
  163. new
  164. XElement(
  165. "
  166. password
  167. "
  168. ,
  169. "
  170. 654321
  171. "
  172. ),
  173. 34
  174. new
  175. XElement(
  176. "
  177. description
  178. "
  179. ,
  180. "
  181. Hello I'm from Jilin
  182. "
  183. )
  184. 35
  185. )
  186. 36
  187. )
  188. 37
  189. );
  190. 38
  191. //
  192. 保存此结构(即:我们预期的xml文件)
  193. 39
  194. myXDoc.Save(xmlPath);
  195. 40
  196. }
  197. 41
  198. catch
  199. (Exception ex)
  200. 42
  201. {
  202. 43
  203. Console.WriteLine(ex.ToString());
  204. 44
  205. }
  206. 45
  207. }
  208. 46
  209. }

复制代码

【注:由于使用了Linq to xml的方式,所以要引入命名空间System.Xml.Linq】,通过运行上面这段代码,就可以创建我们预想的xml文件结构,并且可以看出用Linq这种方式,在代码中就可以很清楚明了知道我们创建xml文件的结构(如:构造函数的参数所示)

  ②:【遍历xml文件的节点信息】创造出了xml文件之后,我们就要知道如何获得xml文件的各个节点的信息,请看如下代码:

复制代码

  1. 1
  2. private
  3. static
  4. void
  5. GetXmlNodeInforOld(
  6. string
  7. xmlPath)
  8. 2
  9. {
  10. 3
  11. try
  12. 4
  13. {
  14. 5
  15. XDocument myXDoc
  16. =
  17. XDocument.Load(xmlPath);
  18. 6
  19. XElement rootNode
  20. =
  21. myXDoc.Element(
  22. "
  23. Users
  24. "
  25. );
  26. 7
  27. foreach
  28. (XElement node
  29. in
  30. rootNode.Elements(
  31. "
  32. User
  33. "
  34. ))
  35. 8
  36. {
  37. 9
  38. Console.WriteLine(
  39. "
  40. User ID = {0}
  41. "
  42. , node.Attribute(
  43. "
  44. ID
  45. "
  46. ).Value);
  47. 10
  48. 11
  49. string
  50. name
  51. =
  52. node.Element(
  53. "
  54. name
  55. "
  56. ).Value;
  57. 12
  58. string
  59. password
  60. =
  61. node.Element(
  62. "
  63. password
  64. "
  65. ).Value;
  66. 13
  67. string
  68. description
  69. =
  70. node.Element(
  71. "
  72. description
  73. "
  74. ).Value;
  75. 14
  76. Console.WriteLine(
  77. "
  78. name = {0} \npassword = {1} \ndescription = {2}
  79. "
  80. , name, password, description);
  81. 15
  82. }
  83. 16
  84. }
  85. 17
  86. catch
  87. (Exception ex)
  88. 18
  89. {
  90. 19
  91. Console.WriteLine(ex.ToString());
  92. 20
  93. }
  94. 21
  95. }
  96. 22
  97. 23
  98. private
  99. static
  100. void
  101. GetXmlNodeInformation(
  102. string
  103. xmlPath)
  104. 24
  105. {
  106. 25
  107. try
  108. 26
  109. {
  110. 27
  111. //
  112. 定义并从xml文件中加载节点(根节点)
  113. 28
  114. XElement rootNode
  115. =
  116. XElement.Load(xmlPath);
  117. 29
  118. //
  119. 查询语句: 获得根节点下name子节点(此时的子节点可以跨层次:孙节点、重孙节点......)
  120. 30
  121. IEnumerable
  122. <
  123. XElement
  124. >
  125. targetNodes
  126. =
  127. from target
  128. in
  129. rootNode.Descendants(
  130. "
  131. name
  132. "
  133. )
  134. 31
  135. select target;
  136. 32
  137. foreach
  138. (XElement node
  139. in
  140. targetNodes)
  141. 33
  142. {
  143. 34
  144. Console.WriteLine(
  145. "
  146. name = {0}
  147. "
  148. , node.Value);
  149. 35
  150. }
  151. 36
  152. 37
  153. //
  154. 查询语句: 获取ID属性值等于"111111"并且函数子节点的所有User节点(并列条件用"&&"符号连接)
  155. 38
  156. IEnumerable
  157. <
  158. XElement
  159. >
  160. myTargetNodes
  161. =
  162. from myTarget
  163. in
  164. rootNode.Descendants(
  165. "
  166. User
  167. "
  168. )
  169. 39
  170. where
  171. myTarget.Attribute(
  172. "
  173. ID
  174. "
  175. ).Value.Equals(
  176. "
  177. 111111
  178. "
  179. )
  180. &&
  181. myTarget.HasElements
  182. 40
  183. select myTarget;
  184. 41
  185. foreach
  186. (XElement node
  187. in
  188. myTargetNodes)
  189. 42
  190. {
  191. 43
  192. Console.WriteLine(
  193. "
  194. name = {0}
  195. "
  196. , node.Element(
  197. "
  198. name
  199. "
  200. ).Value);
  201. 44
  202. Console.WriteLine(
  203. "
  204. password = {0}
  205. "
  206. , node.Element(
  207. "
  208. password
  209. "
  210. ).Value);
  211. 45
  212. Console.WriteLine(
  213. "
  214. description = {0}
  215. "
  216. , node.Element(
  217. "
  218. description
  219. "
  220. ).Value);
  221. 46
  222. }
  223. 47
  224. }
  225. 48
  226. catch
  227. (Exception ex)
  228. 49
  229. {
  230. 50
  231. Console.WriteLine(ex.ToString());
  232. 51
  233. }
  234. 52
  235. }

复制代码

  上面用了两种方法去实现对xml文件节点信息的读取,第一种方法是那种比较老的模式:通过父节点获得它的子节点(一层一层的获得),然后获取目标节点的信息;第二中方法用到的是Linq to xml的查询模式,根据我们的需求获得符合条件的所有节点,然后对这些节点的信息进行读取。

  接下来我们要简单的讲述一下Linq to xml的查询模式(语法一看便懂,这里就不过多阐述了),LINQ to XML 的一个最重要的性能优势(与 XmlDocument 相比)为:LINQ to XML 中的查询是静态编译的,而 XPath 查询则必须在运行时进行解释,此功能是 LINQ to XML 的内置功能。

  在调试程序的时候我们发现,第二种方法的IEnumerable targetNodes = from target in rootNode.Descendants(“name”) select target;的这句话执行完毕后,得到的targetNodes依然是null,直到遍历的时候才获得相应的对象信息,这种方式就做延迟执行,【延迟执行】:意味着表达式的计算延迟,直到真正需要它的实现值为止。 当必须操作大型数据集合,特别是在包含一系列链接的查询或操作的程序中操作时,延迟执行可以大大改善性能。 在最佳情况下,延迟执行只允许对源集合的单个循环访问。

  【注:查询条件写在where语句中,并列条件用”&&”符号连接,或条件用”||”符号连接】

  ③:【修改xml文件的节点信息】知道了如何查询xml文件的节点信息之后,对相应节点信息做相应的修改,就显得很容易了。请看如下代码:

复制代码

  1. 1
  2. private
  3. static
  4. void
  5. ModifyXmlNodeInforOld(
  6. string
  7. xmlPath)
  8. 2
  9. {
  10. 3
  11. try
  12. 4
  13. {
  14. 5
  15. XDocument myXDoc
  16. =
  17. XDocument.Load(xmlPath);
  18. 6
  19. myXDoc.Element(
  20. "
  21. Users
  22. "
  23. ).Element(
  24. "
  25. User
  26. "
  27. ).Attribute(
  28. "
  29. ID
  30. "
  31. ).Value
  32. =
  33. "
  34. 777777
  35. "
  36. ;
  37. 7
  38. foreach
  39. (XElement node
  40. in
  41. myXDoc.Element(
  42. "
  43. Users
  44. "
  45. ).Elements(
  46. "
  47. User
  48. "
  49. ).Elements(
  50. "
  51. description
  52. "
  53. ))
  54. 8
  55. {
  56. 9
  57. node.SetValue(
  58. "
  59. Hello, I'm from China.
  60. "
  61. );
  62. 10
  63. }
  64. 11
  65. myXDoc.Save(xmlPath);
  66. 12
  67. }
  68. 13
  69. catch
  70. (Exception ex)
  71. 14
  72. {
  73. 15
  74. Console.WriteLine(ex.ToString());
  75. 16
  76. }
  77. 17
  78. }
  79. 18
  80. 19
  81. private
  82. static
  83. void
  84. ModifyXmlNodeInformation(
  85. string
  86. xmlPath)
  87. 20
  88. {
  89. 21
  90. try
  91. 22
  92. {
  93. 23
  94. //
  95. 定义并从xml文件中加载节点(根节点)
  96. 24
  97. XElement rootNode
  98. =
  99. XElement.Load(xmlPath);
  100. 25
  101. //
  102. 查询语句: 获取ID属性值等于"222222"或者等于"777777"的所有User节点(或条件用"||"符号连接)
  103. 26
  104. IEnumerable
  105. <
  106. XElement
  107. >
  108. targetNodes
  109. =
  110. from target
  111. in
  112. rootNode.Descendants(
  113. "
  114. User
  115. "
  116. )
  117. 27
  118. where
  119. target.Attribute(
  120. "
  121. ID
  122. "
  123. ).Value
  124. ==
  125. "
  126. 222222
  127. "
  128. ||
  129. target.Attribute(
  130. "
  131. ID
  132. "
  133. ).Value.Equals(
  134. "
  135. 777777
  136. "
  137. )
  138. 28
  139. select target;
  140. 29
  141. //
  142. 遍历所获得的目标节点(集合)
  143. 30
  144. foreach
  145. (XElement node
  146. in
  147. targetNodes)
  148. 31
  149. {
  150. 32
  151. //
  152. description节点的InnerText设置为"Hello, I'm from USA."
  153. 33
  154. node.Element(
  155. "
  156. description
  157. "
  158. ).SetValue(
  159. "
  160. Hello, I'm from USA.
  161. "
  162. );
  163. 34
  164. }
  165. 35
  166. //
  167. 保存对xml的更改操作
  168. 36
  169. rootNode.Save(xmlPath);
  170. 37
  171. }
  172. 38
  173. catch
  174. (Exception ex)
  175. 39
  176. {
  177. 40
  178. Console.WriteLine(ex.ToString());
  179. 41
  180. }
  181. 42
  182. }

复制代码

  这里也用了两种方法去获取相应节点信息的,具体过程请看代码就可以啦。

  ④:【向xml文件添加节点信息】下面的代码是向原有xml文件中添加一个节点

复制代码

  1. 1
  2. private
  3. static
  4. void
  5. AddXmlNodeInformation(
  6. string
  7. xmlPath)
  8. 2
  9. {
  10. 3
  11. try
  12. 4
  13. {
  14. 5
  15. //
  16. 定义并从xml文件中加载节点(根节点)
  17. 6
  18. XElement rootNode
  19. =
  20. XElement.Load(xmlPath);
  21. 7
  22. //
  23. 定义一个新节点
  24. 8
  25. XElement newNode
  26. =
  27. new
  28. XElement(
  29. "
  30. User
  31. "
  32. ,
  33. new
  34. XAttribute(
  35. "
  36. ID
  37. "
  38. ,
  39. "
  40. 999999
  41. "
  42. ),
  43. 9
  44. new
  45. XElement(
  46. "
  47. name
  48. "
  49. ,
  50. "
  51. Rose
  52. "
  53. ),
  54. 10
  55. new
  56. XElement(
  57. "
  58. password
  59. "
  60. ,
  61. "
  62. 456123
  63. "
  64. ),
  65. 11
  66. new
  67. XElement(
  68. "
  69. description
  70. "
  71. ,
  72. "
  73. Hello, I'm from UK.
  74. "
  75. ));
  76. 12
  77. //
  78. 将此新节点添加到根节点下
  79. 13
  80. rootNode.Add(newNode);
  81. 14
  82. //
  83. 保存对xml的更改操作
  84. 15
  85. rootNode.Save(xmlPath);
  86. 16
  87. }
  88. 17
  89. catch
  90. (Exception ex)
  91. 18
  92. {
  93. 19
  94. Console.WriteLine(ex.ToString());
  95. 20
  96. }
  97. 21
  98. }

复制代码

  简单做一个总结:下面的方法将子内容添加到 XElement 或 XDocument 中:

  方法 说明

  Add 在 XContainer 的子内容的末尾添加内容。

  AddFirst 在 XContainer 的子内容的开头添加内容。

  下面的方法将内容添加为 XNode 的同级节点。 向其中添加同级内容的最常见的节点是 XElement,不过你也可以将有效的同级内容添加到其他类型的节点,

  例如 XText 或 XComment。

  方法 说明

  AddAfterSelf 在 XNode 后面添加内容。

  AddBeforeSelf 在 XNode 前面添加内容。

  ⑤:【删除指定xml文件的节点信息】如何将刚刚加入的那个节点删除掉呢?请看如下代码:

复制代码

  1. 1
  2. private
  3. static
  4. void
  5. DeleteXmlNodeInformation(
  6. string
  7. xmlPath)
  8. 2
  9. {
  10. 3
  11. try
  12. 4
  13. {
  14. 5
  15. //
  16. 定义并从xml文件中加载节点(根节点)
  17. 6
  18. XElement rootNode
  19. =
  20. XElement.Load(xmlPath);
  21. 7
  22. //
  23. 查询语句: 获取ID属性值等于"999999"的所有User节点
  24. 8
  25. IEnumerable
  26. <
  27. XElement
  28. >
  29. targetNodes
  30. =
  31. from target
  32. in
  33. rootNode.Descendants(
  34. "
  35. User
  36. "
  37. )
  38. 9
  39. where
  40. target.Attribute(
  41. "
  42. ID
  43. "
  44. ).Value.Equals(
  45. "
  46. 999999
  47. "
  48. )
  49. 10
  50. select target;
  51. 11
  52. 12
  53. //
  54. 将获得的节点集合中的每一个节点依次从它相应的父节点中删除
  55. 13
  56. targetNodes.Remove();
  57. 14
  58. //
  59. 保存对xml的更改操作
  60. 15
  61. rootNode.Save(xmlPath);
  62. 16
  63. }
  64. 17
  65. catch
  66. (Exception ex)
  67. 18
  68. {
  69. 19
  70. Console.WriteLine(ex.ToString());
  71. 20
  72. }
  73. 21
  74. }

复制代码

至此,我们就完成对xml文件的基本操作:创建、读取、修改、添加、删除。由于刚刚学习Linq,理解的很浅显,如有不合适的地方,欢迎大家指出~~

参考:http://www.cnblogs.com/mingmingruyuedlut/archive/2011/01/27/1946239.html

发表评论

表情:
评论列表 (有 0 条评论,259人围观)

还没有评论,来说两句吧...

相关阅读