博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linq to xml 增删查改
阅读量:6215 次
发布时间:2019-06-21

本文共 7991 字,大约阅读时间需要 26 分钟。

一、XML基本概述

        XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许多重要的场所都有它的身影。Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。微软也提供了一系列类库来倒帮助我们在应用程序中存储XML文件。

        “在程序中访问进而操作XML文件一般有两种模型,分别是使用DOM(文档对象模型)和流模型,使用DOM的好处在于它允许编辑和更新XML文档,可以随机访问文档中的数据,可以使用XPath查询,但是,DOM的缺点在于它需要一次性的加载整个文档到内存中,对于大型的文档,这会造成资源问题。流模型很好的解决了这个问题,因为它对XML文件的访问采用的是流的概念,也就是说,任何时候在内存中只有当前节点,但它也有它的不足,它是只读的,仅向前的,不能在文档中执行向后导航操作。

 

         三种常用的读取XML文件的方法。分别是

         ①使用XmlDocument

         ②使用XmlTextReader

         ③使用Linq to Xml

         本文主要讨论使用Linq to Xml的方法实现对XML文档的创建、增加、删除、修改、查询的操作。

二、创建XML文档

[csharp] 
 
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6. using System.Xml.Linq;  
  7.   
  8. namespace CreateXML  
  9. {  
  10.     class Program  
  11.     {  
  12.         static void Main(string[] args)  
  13.         {  
  14.             //实例化XDocument对象  
  15.             XDocument xdoc = new XDocument();  
  16.             //创建根节点  
  17.             XElement root = new XElement("school");  
  18.             //创建子节点  
  19.             XElement cls = new XElement("class");  
  20.             cls.SetAttributeValue("number", "0302"); //添加子节点的属性,如3年级2班  
  21.             //创建子节点class的子节点学生stu1  
  22.             XElement stu1 = new XElement("student");  
  23.             stu1.SetAttributeValue("id", "001"); //添加子节点stu1的属性,如学号001  
  24.             stu1.SetElementValue("name", "张三"); //添加子节点stu1的数据,如姓名张三  
  25.             stu1.SetElementValue("gender", "男"); //添加子节点stu1的数据,如性别男  
  26.             stu1.SetElementValue("age", "19"); //添加子节点stu1的数据,如年龄19  
  27.             //创建子节点class的子节点学生stu2  
  28.             XElement stu2 = new XElement("student");  
  29.             stu2.SetAttributeValue("id", "002"); //添加子节点stu2的属性,如学号002  
  30.             stu2.SetElementValue("name", "李晓梅"); //添加子节点stu2的数据,如姓名李晓梅  
  31.             stu2.SetElementValue("gender", "女"); //添加子节点stu2的数据,如性别女  
  32.             stu2.SetElementValue("age", "18"); //添加子节点stu2的数据,如年龄18  
  33.             cls.Add(stu1); //添加student到class  
  34.             cls.Add(stu2); //添加student到class  
  35.             root.Add(cls); //添加子节点class到根节点school  
  36.             xdoc.Add(root); //添加根节点到XDoucment对象  
  37.             xdoc.Save("1.xml"); //使用XML的保存会自动在xml文件开始添加:<?xml version="1.0" encoding="utf-8"?>  
  38.             Console.WriteLine("创建XML文件成功!");  
  39.             Console.ReadKey();  
  40.         }  
  41.     }  
  42. }  

生成的xml文档如下:

[html] 
 
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <school>  
  3.   <class number="0302">  
  4.     <student id="001">  
  5.       <name>张三</name>  
  6.       <gender>男</gender>  
  7.       <age>19</age>  
  8.     </student>  
  9.     <student id="002">  
  10.       <name>李晓梅</name>  
  11.       <gender>女</gender>  
  12.       <age>18</age>  
  13.     </student>  
  14.   </class>  
  15. </school>  

三、读取XML文档

[csharp] 
 
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6. using System.Xml.Linq;  
  7.   
  8. namespace ReadXML  
  9. {  
  10.     class Program  
  11.     {  
  12.         static void Main(string[] args)  
  13.         {  
  14.             string path = "1.xml";  
  15.             XDocument xdoc = XDocument.Load(path); //加载xml文件  
  16.             XElement rootSchool = xdoc.Root; //获取根元素  
  17.             //Console.WriteLine(rootSchool.Name); //根元素的名字  
  18.             IEnumerable<XElement> xeles = rootSchool.Elements(); //获取根元素下所有的直接子元素  
  19.             foreach (XElement xeleClass in xeles)  
  20.             {  
  21.                 foreach (XElement xeleStudent in xeleClass.Elements())  
  22.                 {  
  23.                     Console.WriteLine(xeleStudent.Name); //获取节点名  
  24.                     Console.WriteLine(xeleStudent.Attribute("id").Value); //获取属性值  
  25.                     Console.WriteLine(xeleStudent.Element("name").Value); //下面3行是获取数据  
  26.                     Console.WriteLine(xeleStudent.Element("gender").Value);  
  27.                     Console.WriteLine(xeleStudent.Element("age").Value);  
  28.                 }  
  29.             }  
  30.             Console.ReadKey();  
  31.         }  
  32.     }  
  33. }  

运行结果如下图:

三、增加XML文档内容

[csharp] 
 
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6. using System.Xml.Linq;  
  7.   
  8. namespace AddXML  
  9. {  
  10.     class Program  
  11.     {  
  12.         static void Main(string[] args)  
  13.         {  
  14.             string path = "1.xml";  
  15.             XDocument xdoc = XDocument.Load(path);  
  16.             XElement xeleRoot = xdoc.Root;  
  17.   
  18.             //在已存在的节点上添加属性和数据  
  19.             XElement xeleClass = xeleRoot.Element("class");  
  20.             XElement xeleStu3 = new XElement("student");  
  21.             xeleStu3.SetAttributeValue("id", "005");  
  22.             xeleStu3.SetElementValue("name", "王五");  
  23.             xeleStu3.SetElementValue("gender", "男");  
  24.             xeleStu3.SetElementValue("age", "40");  
  25.             xeleClass.Add(xeleStu3);  
  26.   
  27.             //在根节点下添加新的直接子节点及次级节点的属性和数据  
  28.             //XElement xeleClass = new XElement("class");  
  29.             //xeleClass.SetAttributeValue("number", "0501");  
  30.             //XElement xeleStu1 = new XElement("student");  
  31.             //xeleStu1.SetAttributeValue("id", "003");  
  32.             //xeleStu1.SetElementValue("name","刘芳");  
  33.             //xeleStu1.SetElementValue("gender","女");  
  34.             //xeleStu1.SetElementValue("age","26");  
  35.             //XElement xeleStu2 = new XElement("student");  
  36.             //xeleStu2.SetAttributeValue("id", "004");  
  37.             //xeleStu2.SetElementValue("name", "王亮");  
  38.             //xeleStu2.SetElementValue("gender", "男");  
  39.             //xeleStu2.SetElementValue("age", "36");  
  40.             //xeleClass.Add(xeleStu1);  
  41.             //xeleClass.Add(xeleStu2);  
  42.             //xeleRoot.Add(xeleClass);  
  43.   
  44.             xdoc.Save("1.xml");  
  45.             Console.WriteLine("添加xml成功");  
  46.             Console.ReadKey();  
  47.         }  
  48.     }  
  49. }  

在已存在的节点上添加属性和数据,xml文件如下:

[html] 
 
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <school>  
  3.   <class number="0302">  
  4.     <student id="001">  
  5.       <name>张三</name>  
  6.       <gender>男</gender>  
  7.       <age>19</age>  
  8.     </student>  
  9.     <student id="002">  
  10.       <name>李晓梅</name>  
  11.       <gender>女</gender>  
  12.       <age>18</age>  
  13.     </student>  
  14.     <student id="005">  
  15.       <name>王五</name>  
  16.       <gender>男</gender>  
  17.       <age>40</age>  
  18.     </student>  
  19.   </class>  
  20. </school>  

上面被消隐的代码放开之后,在根节点下添加新的直接子节点及次级节点的属性和数据,xml文件如下:

[html] 
 
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <school>  
  3.   <class number="0302">  
  4.     <student id="001">  
  5.       <name>张三</name>  
  6.       <gender>男</gender>  
  7.       <age>19</age>  
  8.     </student>  
  9.     <student id="002">  
  10.       <name>李晓梅</name>  
  11.       <gender>女</gender>  
  12.       <age>18</age>  
  13.     </student>  
  14.   </class>  
  15.   <class number="0501">  
  16.     <student id="003">  
  17.       <name>刘芳</name>  
  18.       <gender>女</gender>  
  19.       <age>26</age>  
  20.     </student>  
  21.     <student id="004">  
  22.       <name>王亮</name>  
  23.       <gender>男</gender>  
  24.       <age>36</age>  
  25.     </student>  
  26.   </class>  
  27. </school>  

四、删除XML文档内容

[csharp] 
 
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6. using System.Xml.Linq;  
  7.   
  8. namespace DeleteXML  
  9. {  
  10.     class Program  
  11.     {  
  12.         static void Main(string[] args)  
  13.         {  
  14.             XDocument xdoc = XDocument.Load("1.xml");  
  15.             XElement xeleRoot = xdoc.Root;  
  16.   
  17.             //删除根节点的直接子节点  
  18.             XElement xeleClass = xeleRoot.Elements("class").Where(x => x.Attribute("number").Value == "0302").Single(); //拉姆达表达式  
  19.             xeleClass.Remove();  
  20.   
  21.             //删除根节点的直接子节点的下一级节点  
  22.             //XElement xeleClass = xeleRoot.Elements("class").Where(x => x.Attribute("number").Value == "0302").Single(); //获取班级号为0302的直接子节点  
  23.             //XElement xeleStudent = xeleClass.Elements("student").Where(x => x.Attribute("id").Value == "001").Single(); //获取学号为001的直接子节点的下一级节点  
  24.             //xeleStudent.Remove();  
  25.   
  26.             xdoc.Save("1.xml");  
  27.             Console.WriteLine("删除节点成功!");  
  28.             Console.ReadKey();  
  29.         }  
  30.     }  
  31. }  

删除根节点的直接子节点,xml文件如下:

[html] 
 
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <school>  
  3.   <class number="0501">  
  4.     <student id="003">  
  5.       <name>刘芳</name>  
  6.       <gender>女</gender>  
  7.       <age>26</age>  
  8.     </student>  
  9.     <student id="004">  
  10.       <name>王亮</name>  
  11.       <gender>男</gender>  
  12.       <age>36</age>  
  13.     </student>  
  14.   </class>  
  15. </school>  

删除根节点的直接子节点的下一级节点,xml文件如下:

[html] 
 
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <school>  
  3.   <class number="0302">  
  4.     <student id="002">  
  5.       <name>李晓梅</name>  
  6.       <gender>女</gender>  
  7.       <age>18</age>  
  8.     </student>  
  9.   </class>  
  10.   <class number="0501">  
  11.     <student id="003">  
  12.       <name>刘芳</name>  
  13.       <gender>女</gender>  
  14.       <age>26</age>  
  15.     </student>  
  16.     <student id="004">  
  17.       <name>王亮</name>  
  18.       <gender>男</gender>  
  19.       <age>36</age>  
  20.     </student>  
  21.   </class>  
  22. </school>  

五、修改XML文档内容

[csharp] 
 
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6. using System.Xml.Linq;  
  7.   
  8. namespace UpdateXML  
  9. {  
  10.     class Program  
  11.     {  
  12.         static void Main(string[] args)  
  13.         {  
  14.             XDocument xdoc = XDocument.Load("1.xml");  
  15.             XElement xeleRoot = xdoc.Root;  
  16.             XElement xeleClass = xeleRoot.Elements("class").Where(x => x.Attribute("number").Value == "0302").Single(); //获取班级号为0302的直接子节点  
  17.             XElement xeleStudent = xeleClass.Elements("student").Where(x => x.Attribute("id").Value == "001").Single(); //获取学号为001的直接子节点的下一级节点  
  18.             xeleStudent.SetAttributeValue("id", "008");  
  19.             xeleStudent.SetElementValue("name","邦德");  
  20.             xeleStudent.SetElementValue("gender","爷们");  
  21.             xeleStudent.SetElementValue("age","39");  
  22.             xdoc.Save("1.xml");  
  23.             Console.WriteLine("修改成功!");  
  24.             Console.ReadKey();  
  25.         }  
  26.     }  
  27. }  

执行后xml文件如下:

[html] 
 
 
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <school>  
    3.   <class number="0302">  
    4.     <student id="008">  
    5.       <name>邦德</name>  
    6.       <gender>爷们</gender>  
    7.       <age>39</age>  
    8.     </student>  
    9.     <student id="002">  
    10.       <name>李晓梅</name>  
    11.       <gender>女</gender>  
    12.       <age>18</age>  
    13.     </student>  
    14.   </class>  
    15.   <class number="0501">  
    16.     <student id="003">  
    17.       <name>刘芳</name>  
    18.       <gender>女</gender>  
    19.       <age>26</age>  
    20.     </student>  
    21.     <student id="004">  
    22.       <name>王亮</name>  
    23.       <gender>男</gender>  
    24.       <age>36</age>  
    25.     </student>  
    26.   </class>  
    27. </school
你可能感兴趣的文章
使用Gitblit 在windows 上部署你的Git Server
查看>>
object pool
查看>>
Numpy.random中shuffle与permutation的区别(转)
查看>>
Spring Cloud Config 服务端与 客户端之间的关系
查看>>
Lemur(狐猴)一个用于自然语言模型和信息检索研究的系统
查看>>
[iBoard 电子学堂][第〇卷 电子基础 ]第三篇 单片微控制器、微处理器
查看>>
完成端口IO模型
查看>>
SQL FOR XML
查看>>
hdu 3068 最长回文(manachar求最长回文子串)
查看>>
9年经验,总结SEO职业瓶颈
查看>>
【转】李开复:现代企业需要的7种人才
查看>>
Leetcode: Best Time to Buy and Sell Stock IV
查看>>
转: git常用命令
查看>>
HTTP状态码(HTTP Status Code)
查看>>
新浪微博客户端(20)-集成MJRefresh
查看>>
【Java面试题】5 Integer的int 的种种比较?详细分析
查看>>
Servlet3.0新特性WebFilter(Annotation Filter)详解
查看>>
js 上一步 下一步 操作
查看>>
JDK8中函数式流编程推荐
查看>>
Linux下的Cacti网络管理系统---安装(二)
查看>>