linq to xml 增删查改

一、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] view plain copy

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

[html] view plain copy

  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] view plain copy

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

[csharp] view plain copy

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

[html] view plain copy

  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] view plain copy

  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] view plain copy

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

[html] view plain copy

  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] view plain copy

  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] view plain copy

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

[html] view plain copy

    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>

原文地址:https://www.cnblogs.com/siyunianhua/p/8305909.html

时间: 2024-10-08 22:41:05

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

C# xml增删查改

C# XML XmlDocument 添加命名空间: using System.Xml; 定义公共对象: XmlDocument xmldoc ; XmlNode xmlnode ; XmlElement xmlelem ; 1,创建到服务器同名目录下的xml文件: 方法一: xmldoc = new XmlDocument ( ) ; //加入XML的声明段落,<?xml version="1.0" encoding="gb2312"?> XmlDec

4.CRUD Operations Using the Repository Pattern in MVC【在MVC中使用仓储模式进行增删查改】

原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-using-the-repository-pattern-in-mvc/ 上一篇文章,讲到了MVC中基本的增删查改,这篇文章,我会继续说到,使用仓储模式,进行增删查改. 什么是仓储模式呢,我们先来了解一下:  仓储模式是为了在程序的数据访问层和业务逻辑层之间创建一个抽象层,它是一种数据访问模式,提供了一种更松散耦合的数据访问方法.我们把创建数据访问的逻辑代码写在单独的类中,或者类库中

在MVC程序中,使用泛型仓储模式和工作单元实现增删查改

在这片文章中,我将自己动手为所有的实体:写一个泛型仓储类,还有一个工作单元. 工作单元的职责就是:为每一个实体,创建仓储实例.仓储(仓库)的职责:增删查改的功能实现. 我们将会在控制器中,创建工作单元类(UnitOfWork)的实例,然后根据实体,创建仓储实例,再就是使用仓储里面的方法,做操作了. 下面的图中,解释了,仓储和EF 数据上文的关系,在这个图里面,MVC控制器和仓储之间的交互,是通过工作单元来进行的,而不是直接和EF接触. 那么你可能就要问了,为什么要使用工作单元??? 工作单元,就

asp.net MVC最简单的增删查改!(详)

折腾了两天搞出来,但原理性的东西还不是很懂,废话不多说上图上代码 然后右键models,新建一个数据模型 注意我添加命名为lianxi 添加后如上 接下来在controllers添加控制器还有在Views中添加视图 注意控制器lianxi和视图的名字要一致,然后视图我是添加了3个分别是Index,insert,Modify,在控制器里分别有三个对应的函数 每当用URL访问视图时,他就调用了controllers对应的方法,例如 jiaEntities 就是建立模式时那个数据链接的名字      

MyBatis笔记----Mybatis3.4.2与spring4整合:增删查改

结构图 刚之前没什么区别,多了一个applicationContext.xml 包图 由于之前出了一点错误,有些包可能多加上了 数据库图 model User.java package com.ij34.model; public class User { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.

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

原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pattern-and-dep/ 系列目录: Relationship in Entity Framework Using Code First Approach With Fluent API[[使用EF Code-First方式和Fluent API来探讨EF中的关系]] Code First Mig

mybatis实现简单的增删查改

接触一个新技术,首先去了解它的一些基本概念,这项技术用在什么方面的.这样学习起来,方向性也会更强一些.我对于mybatis的理解是,它是一个封装了JDBC的java框架.所能实现的功能是对数据库进行增删查改的功能. 首先,需要搭建一个demo,用于学习这个框架的使用方式.(1)在IDE上建立自己的工程目录,一个普通的java工程项目就好,我电脑本地的IDE是Myeclipse.(2)引入搭建框架需要的jar包,这个直接去网上搜索就好.(3)框架的核心实现都是基于配置的,引入jar包后,先配置my

hibernate基础增删查改简单实例

hibernate 基础理论知识网上很多,可以百度和google.这里不做多的介绍,以一个User表来开展例子 建一个web-project 我这里用了junit单元测试环境来进行增删查改的测试,别的不多说,导包就行 本次用到的所有jar包下载地址: 链接:http://pan.baidu.com/s/1skHrg0t 密码:dbe2 1.hibernate配置文件(hibernate.cfg.xml):主要是数据库连接核心的配置项 <?xml version='1.0' encoding='u

一套手写ajax加一般处理程序的增删查改

倾述下感受:8天16次驳回.这个惨不忍睹. 好了不说了,说多了都是泪. 直接上代码 : 这个里面的字段我是用动软生成的,感觉自己手写哪些字段太浪费时间了,说多了都是泪 ajax.model层的代码: using System; namespace Ajax.Model { /// <summary> /// SM_Class:实体类(属性说明自动提取数据库字段的描述信息) /// </summary> [Serializable] public partial class SM_C