一、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. PAGED_CODE()

    #if DBG #define PAGED_CODE() \ /*APC_LEVEL*/) { \ VideoPortDebugPrint(, "Video: Pageable code c ...

  2. Web前端开发测试题阅读笔记

    引自: http://www.w3cplus.com/css/front-end-web-development-quiz.html Q7:下面代码弹出值是什么? x = 1; function ba ...

  3. 机器人排除标准 robot.txt robot exclusion standard

    18.2 什么是机器人排除标准 <搜索引擎优化宝典(第2版)>第18章机器人.蜘蛛和爬虫,本章主要的内容有:什么是机器人.爬虫和蜘蛛:什么是机器人排除标准; Robots 元标签:用XML ...

  4. MFC函数——CWnd::OnCreate

    CWnd::OnCreate afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct ); 返回值: OnCreate必须返回0以继续CWnd对象的创建 ...

  5. webpack6--css 背景图片处理

    当css里面含有背景图片,用webpack打包时会报如下错: 如何处理这个问题呢? 我们需要借助于 file-loader 和  url-loader 这2个包. 下面具体说一下步骤: 1.安装 fi ...

  6. jq 获取当前屏幕高度

    alert($(window).height()); //浏览器时下窗口可视区域高度 alert($(document).height()); //浏览器时下窗口文档的高度 alert($(docum ...

  7. lr11.0负载测试 real-world schedule 与basic schedule的区别是什么

    real-world schedule 是真实场景模式  可以通过增加ACTION来增加多个用户 basic schedule 是我们以前用的 经典模式  只能设置一次负载的上升和下降

  8. [hbase] HBase内置过滤器的一些总结

    http://blog.csdn.net/cnweike/article/details/42920547

  9. 超频,如何超频CPU和显卡?

    首先是良好的硬件体制,CPU.内存和显卡都必须是健康的,在100%负荷下工作也能拥有合理的温度和功耗.其次就是硬件准备,超频需要一块强大的主板做支撑,特别是主板供电部分,考虑到CPU和内存超频后功耗大 ...

  10. pandas 的算术运算和数据对齐

    pandas 还有一个重要的功能,就是他可以对不同索引的对象进行算数运算.对象相加, 如果存在不同的索引对,则结果的索引就是该索引对的并集. 先来个例子 Series In [33]: s1 = Se ...