一、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文档

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

生成的xml文档如下:

  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文档

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

运行结果如下图:

三、增加XML文档内容

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

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

  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文件如下:

  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文档内容

  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. namespace DeleteXML
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. XDocument xdoc = XDocument.Load("1.xml");
  14. XElement xeleRoot = xdoc.Root;
  15. //删除根节点的直接子节点
  16. XElement xeleClass = xeleRoot.Elements("class").Where(x => x.Attribute("number").Value == "0302").Single(); //拉姆达表达式
  17. xeleClass.Remove();
  18. //删除根节点的直接子节点的下一级节点
  19. //XElement xeleClass = xeleRoot.Elements("class").Where(x => x.Attribute("number").Value == "0302").Single(); //获取班级号为0302的直接子节点
  20. //XElement xeleStudent = xeleClass.Elements("student").Where(x => x.Attribute("id").Value == "001").Single(); //获取学号为001的直接子节点的下一级节点
  21. //xeleStudent.Remove();
  22. xdoc.Save("1.xml");
  23. Console.WriteLine("删除节点成功!");
  24. Console.ReadKey();
  25. }
  26. }
  27. }

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

  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文件如下:

  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文档内容

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

执行后xml文件如下:

    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>

linq to xml 增删查改的更多相关文章

  1. XML 增删查改

    <?xml version="1.0" encoding="utf-8"?> <users> <person name=" ...

  2. C# xml增删查改

    C# XML XmlDocument 添加命名空间: using System.Xml; 定义公共对象: XmlDocument xmldoc ; XmlNode xmlnode ; XmlEleme ...

  3. c#中xml增删查改

    /// <summary> /// xml转list /// </summary> /// <typeparam name="T">目标对象&l ...

  4. java:Hibernate框架1(环境搭建,Hibernate.cfg.xml中属性含义,Hibernate常用API对象,HibernteUitl,对象生命周期图,数据对象的三种状态,增删查改)

    1.环境搭建: 三个准备+7个步骤 准备1:新建项目并添加hibernate依赖的jar文件  准备2:在classpath下(src目录下)新建hibernate的配置文件:hibernate.cf ...

  5. 4.在MVC中使用仓储模式进行增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-using-the-repository-pattern-in-mvc/ 系列目录: ...

  6. Nhibernate入门篇连接Sqlserver的增删查改

    第一步:创建数据库 create table Emp( EmpId int primary key identity, EmpName ), EmpDate date ) 第二步:去官网下载:http ...

  7. 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  8. 3.EF 6.0 Code-First实现增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-entity-framework-5-0-code- ...

  9. 5.在MVC中使用泛型仓储模式和工作单元来进行增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

随机推荐

  1. oracle从零开始学习笔记 三

    高级查询 随机返回5条记录 select * from (select ename,job from emp order by dbms_random.value())where rownum< ...

  2. 02.Sencha ExtJS 6 - What is Viewport?

    什么是Viewport? Viewport (Ext.container.Viewport)是一个专门的容器用于可视应用领域(浏览器窗口).Viewport渲染自身到网页的documet body区域 ...

  3. MSCRM 获取列表所选记录相关信息

    问题:如何通过JS获取列表中所选记录信息? 解决办法: The CRM2011 Ribbon has a special set of parameters called 'CrmParameters ...

  4. iOS 面试题

    1.Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答:不可以,可以实现多个接口:category是分类,,一般情况下分类 ...

  5. UglifyJS-- 对你的js做了什么

    也不是闲着没事去看压缩代码,但今天调试自己代码的时候发现有点意思.因为是自己写的,虽然压缩了,格式化之后还是很好辨认.当然作为min的首要准则不是可读性,而是精简.那么它会尽量的缩短代码,尽量的保持一 ...

  6. python与JavaScript中正则表达式如何转换

    使用python爬取网站数据的时候,总会遇到各种各样的反爬虫策略,有很大一部分都和JavaScript(以下简称为JS) 有关.在破解这些JS代码的过程中,经常会遇到模拟JS正则表达式的情况,因此,今 ...

  7. javascript快速入门2--变量,小学生数学与简单的交互

    变量 对于变量的理解:变量是数据的代号.如同人的名字一样. var num;//在JavaScript中使用关键字var声明一个变量 在JavaScript中,使用上面的语法,就可以声明一个变量,以便 ...

  8. (转)MFC的GUI窗口使用Console输出函数printf

    原文链接 在GUI程序中使用printf函数: #include <io.h> #include <fcntl.h> void InitConsole() { ; FILE* ...

  9. 字节流, FileOutputStream类,FileInputStream类,复制文件,字符流

    字节输出流OutputStream OutputStream此抽象类,是表示输出字节流的所有类的超类.操作的数据都是字节 基本方法: 子类可继承调用以上方法 FileOutputStream类 构造方 ...

  10. String源码中hashCode算法

    针对java中String源码hashcode算法源码分析 /** The value is used for character storage. */ private final char val ...