一、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. yum安装LAMP环境与管理(七)

    [教程主题]:yum安装LAMP环境与管理 [1] 什么是LAMP 目前世界最流行的企业建站方式是LAMP(Linux+Apache+MySQL+PHP),即使用Linux作为操作系统,Apache作 ...

  2. Hive Tuning(五) 标准调优清单

    Hive的标准调优清单,我们可以对照着来做我们的查询优化!

  3. DataWindow.Net组件示例(全部开源)

    1概述 1.1功能简介 Sybase公司的PowerBuilder开发工具,在以前VS工具没有成事以前,是相当风光的.微软都要与其合作,学习它Db方面的技术,才成就了SQLServer数据库.PB开发 ...

  4. Python 字符串操作函数一

    #-*- coding:utf-8 -*- strword = "i will fly with you , fly on the sky ." #find print(strwo ...

  5. JDBC的MySQL配置properties文件

    参考: http://sgq0085.iteye.com/blog/1262469 e.g. 常用数据库URLDerby:  jdbc:derby://localhost:1527/COREJAVA; ...

  6. PhotoshopCS6常用快捷键速查

    写此文的起因:这学期开了一门多媒体技术课程,主要学习Photoshop软件的操作和使用,发觉该软件异常强大,而且有许多快捷键操作,在学期末时查阅了相关资料,特整理如下,供学习借鉴. 一.工具快捷键 二 ...

  7. 第三百八十五节,Django+Xadmin打造上线标准的在线教育平台—登录功能实现,回填数据以及错误提示html

    第三百八十五节,Django+Xadmin打造上线标准的在线教育平台—登录功能实现 1,配置登录路由 from django.conf.urls import url, include # 导入dja ...

  8. Oracle两个数据库互相访问,DBLink使用-转

    测试条件:假设某公司总部在北京,新疆有其下属的一个分公司.在本次测试中,新疆的计算机为本地计算机,即本要的IP地址为:192.168.1.100 北京的总部有一个集中的数据库,其SID是SIDBJ,用 ...

  9. Mac环境下配置tomcat的步骤详解

    前言 相信对Java Web稍微知道一点,一般对Tomcat都不会陌生,Apache是普通服务器,本身只支持html即普通网页,可以通过插件支持PHP,还可以与Tomcat连通(单向Apache连接T ...

  10. svn -- svn安装与配置

    1.SVN分为服务器端与客户端 l 服务器端:VisualSVN   SubVersion l 客户端:TortoiseSVN server http://www.visualsvn.com/ cli ...