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文档
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Xml.Linq;
- namespace CreateXML
- {
- class Program
- {
- static void Main(string[] args)
- {
- //实例化XDocument对象
- XDocument xdoc = new XDocument();
- //创建根节点
- XElement root = new XElement("school");
- //创建子节点
- XElement cls = new XElement("class");
- cls.SetAttributeValue("number", "0302"); //添加子节点的属性,如3年级2班
- //创建子节点class的子节点学生stu1
- XElement stu1 = new XElement("student");
- stu1.SetAttributeValue("id", "001"); //添加子节点stu1的属性,如学号001
- stu1.SetElementValue("name", "张三"); //添加子节点stu1的数据,如姓名张三
- stu1.SetElementValue("gender", "男"); //添加子节点stu1的数据,如性别男
- stu1.SetElementValue("age", "19"); //添加子节点stu1的数据,如年龄19
- //创建子节点class的子节点学生stu2
- XElement stu2 = new XElement("student");
- stu2.SetAttributeValue("id", "002"); //添加子节点stu2的属性,如学号002
- stu2.SetElementValue("name", "李晓梅"); //添加子节点stu2的数据,如姓名李晓梅
- stu2.SetElementValue("gender", "女"); //添加子节点stu2的数据,如性别女
- stu2.SetElementValue("age", "18"); //添加子节点stu2的数据,如年龄18
- cls.Add(stu1); //添加student到class
- cls.Add(stu2); //添加student到class
- root.Add(cls); //添加子节点class到根节点school
- xdoc.Add(root); //添加根节点到XDoucment对象
- xdoc.Save("1.xml"); //使用XML的保存会自动在xml文件开始添加:<?xml version="1.0" encoding="utf-8"?>
- Console.WriteLine("创建XML文件成功!");
- Console.ReadKey();
- }
- }
- }
生成的xml文档如下:
- <?xml version="1.0" encoding="utf-8"?>
- <school>
- <class number="0302">
- <student id="001">
- <name>张三</name>
- <gender>男</gender>
- <age>19</age>
- </student>
- <student id="002">
- <name>李晓梅</name>
- <gender>女</gender>
- <age>18</age>
- </student>
- </class>
- </school>
三、读取XML文档
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Xml.Linq;
- namespace ReadXML
- {
- class Program
- {
- static void Main(string[] args)
- {
- string path = "1.xml";
- XDocument xdoc = XDocument.Load(path); //加载xml文件
- XElement rootSchool = xdoc.Root; //获取根元素
- //Console.WriteLine(rootSchool.Name); //根元素的名字
- IEnumerable<XElement> xeles = rootSchool.Elements(); //获取根元素下所有的直接子元素
- foreach (XElement xeleClass in xeles)
- {
- foreach (XElement xeleStudent in xeleClass.Elements())
- {
- Console.WriteLine(xeleStudent.Name); //获取节点名
- Console.WriteLine(xeleStudent.Attribute("id").Value); //获取属性值
- Console.WriteLine(xeleStudent.Element("name").Value); //下面3行是获取数据
- Console.WriteLine(xeleStudent.Element("gender").Value);
- Console.WriteLine(xeleStudent.Element("age").Value);
- }
- }
- Console.ReadKey();
- }
- }
- }
运行结果如下图:
三、增加XML文档内容
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Xml.Linq;
- namespace AddXML
- {
- class Program
- {
- static void Main(string[] args)
- {
- string path = "1.xml";
- XDocument xdoc = XDocument.Load(path);
- XElement xeleRoot = xdoc.Root;
- //在已存在的节点上添加属性和数据
- XElement xeleClass = xeleRoot.Element("class");
- XElement xeleStu3 = new XElement("student");
- xeleStu3.SetAttributeValue("id", "005");
- xeleStu3.SetElementValue("name", "王五");
- xeleStu3.SetElementValue("gender", "男");
- xeleStu3.SetElementValue("age", "40");
- xeleClass.Add(xeleStu3);
- //在根节点下添加新的直接子节点及次级节点的属性和数据
- //XElement xeleClass = new XElement("class");
- //xeleClass.SetAttributeValue("number", "0501");
- //XElement xeleStu1 = new XElement("student");
- //xeleStu1.SetAttributeValue("id", "003");
- //xeleStu1.SetElementValue("name","刘芳");
- //xeleStu1.SetElementValue("gender","女");
- //xeleStu1.SetElementValue("age","26");
- //XElement xeleStu2 = new XElement("student");
- //xeleStu2.SetAttributeValue("id", "004");
- //xeleStu2.SetElementValue("name", "王亮");
- //xeleStu2.SetElementValue("gender", "男");
- //xeleStu2.SetElementValue("age", "36");
- //xeleClass.Add(xeleStu1);
- //xeleClass.Add(xeleStu2);
- //xeleRoot.Add(xeleClass);
- xdoc.Save("1.xml");
- Console.WriteLine("添加xml成功");
- Console.ReadKey();
- }
- }
- }
在已存在的节点上添加属性和数据,xml文件如下:
- <?xml version="1.0" encoding="utf-8"?>
- <school>
- <class number="0302">
- <student id="001">
- <name>张三</name>
- <gender>男</gender>
- <age>19</age>
- </student>
- <student id="002">
- <name>李晓梅</name>
- <gender>女</gender>
- <age>18</age>
- </student>
- <student id="005">
- <name>王五</name>
- <gender>男</gender>
- <age>40</age>
- </student>
- </class>
- </school>
上面被消隐的代码放开之后,在根节点下添加新的直接子节点及次级节点的属性和数据,xml文件如下:
- <?xml version="1.0" encoding="utf-8"?>
- <school>
- <class number="0302">
- <student id="001">
- <name>张三</name>
- <gender>男</gender>
- <age>19</age>
- </student>
- <student id="002">
- <name>李晓梅</name>
- <gender>女</gender>
- <age>18</age>
- </student>
- </class>
- <class number="0501">
- <student id="003">
- <name>刘芳</name>
- <gender>女</gender>
- <age>26</age>
- </student>
- <student id="004">
- <name>王亮</name>
- <gender>男</gender>
- <age>36</age>
- </student>
- </class>
- </school>
四、删除XML文档内容
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Xml.Linq;
- namespace DeleteXML
- {
- class Program
- {
- static void Main(string[] args)
- {
- XDocument xdoc = XDocument.Load("1.xml");
- XElement xeleRoot = xdoc.Root;
- //删除根节点的直接子节点
- XElement xeleClass = xeleRoot.Elements("class").Where(x => x.Attribute("number").Value == "0302").Single(); //拉姆达表达式
- xeleClass.Remove();
- //删除根节点的直接子节点的下一级节点
- //XElement xeleClass = xeleRoot.Elements("class").Where(x => x.Attribute("number").Value == "0302").Single(); //获取班级号为0302的直接子节点
- //XElement xeleStudent = xeleClass.Elements("student").Where(x => x.Attribute("id").Value == "001").Single(); //获取学号为001的直接子节点的下一级节点
- //xeleStudent.Remove();
- xdoc.Save("1.xml");
- Console.WriteLine("删除节点成功!");
- Console.ReadKey();
- }
- }
- }
删除根节点的直接子节点,xml文件如下:
- <?xml version="1.0" encoding="utf-8"?>
- <school>
- <class number="0501">
- <student id="003">
- <name>刘芳</name>
- <gender>女</gender>
- <age>26</age>
- </student>
- <student id="004">
- <name>王亮</name>
- <gender>男</gender>
- <age>36</age>
- </student>
- </class>
- </school>
删除根节点的直接子节点的下一级节点,xml文件如下:
- <?xml version="1.0" encoding="utf-8"?>
- <school>
- <class number="0302">
- <student id="002">
- <name>李晓梅</name>
- <gender>女</gender>
- <age>18</age>
- </student>
- </class>
- <class number="0501">
- <student id="003">
- <name>刘芳</name>
- <gender>女</gender>
- <age>26</age>
- </student>
- <student id="004">
- <name>王亮</name>
- <gender>男</gender>
- <age>36</age>
- </student>
- </class>
- </school>
五、修改XML文档内容
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Xml.Linq;
- namespace UpdateXML
- {
- class Program
- {
- static void Main(string[] args)
- {
- XDocument xdoc = XDocument.Load("1.xml");
- XElement xeleRoot = xdoc.Root;
- XElement xeleClass = xeleRoot.Elements("class").Where(x => x.Attribute("number").Value == "0302").Single(); //获取班级号为0302的直接子节点
- XElement xeleStudent = xeleClass.Elements("student").Where(x => x.Attribute("id").Value == "001").Single(); //获取学号为001的直接子节点的下一级节点
- xeleStudent.SetAttributeValue("id", "008");
- xeleStudent.SetElementValue("name","邦德");
- xeleStudent.SetElementValue("gender","爷们");
- xeleStudent.SetElementValue("age","39");
- xdoc.Save("1.xml");
- Console.WriteLine("修改成功!");
- Console.ReadKey();
- }
- }
- }
执行后xml文件如下:
- <?xml version="1.0" encoding="utf-8"?>
- <school>
- <class number="0302">
- <student id="008">
- <name>邦德</name>
- <gender>爷们</gender>
- <age>39</age>
- </student>
- <student id="002">
- <name>李晓梅</name>
- <gender>女</gender>
- <age>18</age>
- </student>
- </class>
- <class number="0501">
- <student id="003">
- <name>刘芳</name>
- <gender>女</gender>
- <age>26</age>
- </student>
- <student id="004">
- <name>王亮</name>
- <gender>男</gender>
- <age>36</age>
- </student>
- </class>
- </school>
linq to xml 增删查改的更多相关文章
- XML 增删查改
<?xml version="1.0" encoding="utf-8"?> <users> <person name=" ...
- C# xml增删查改
C# XML XmlDocument 添加命名空间: using System.Xml; 定义公共对象: XmlDocument xmldoc ; XmlNode xmlnode ; XmlEleme ...
- c#中xml增删查改
/// <summary> /// xml转list /// </summary> /// <typeparam name="T">目标对象&l ...
- java:Hibernate框架1(环境搭建,Hibernate.cfg.xml中属性含义,Hibernate常用API对象,HibernteUitl,对象生命周期图,数据对象的三种状态,增删查改)
1.环境搭建: 三个准备+7个步骤 准备1:新建项目并添加hibernate依赖的jar文件 准备2:在classpath下(src目录下)新建hibernate的配置文件:hibernate.cf ...
- 4.在MVC中使用仓储模式进行增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-using-the-repository-pattern-in-mvc/ 系列目录: ...
- Nhibernate入门篇连接Sqlserver的增删查改
第一步:创建数据库 create table Emp( EmpId int primary key identity, EmpName ), EmpDate date ) 第二步:去官网下载:http ...
- 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
- 3.EF 6.0 Code-First实现增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-entity-framework-5-0-code- ...
- 5.在MVC中使用泛型仓储模式和工作单元来进行增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
随机推荐
- 提高Java代码质量的Eclipse插件之Checkstyle的使用具体解释
CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发者遵守某些编码规范的工具.它可以自己主动化代码规范检查过程.从而使得开发者从这项重要可是枯燥的任务中解脱出来. Ch ...
- 【转载】解决Windows和Ubuntu时间不一致的问题
大家在切换操作系统的时候会发现一个问题, Windows 和Ubuntu的时间会出现不一致的情况.在 Windows 中把时间设置正确了过后,回到在 Ubuntu 后系统的时间又不一样了,在 Ubun ...
- ECS Linux服务器xfs磁盘扩容
ECS Linux服务器xfs磁盘扩 ECS Linux服务器xfs磁盘使用阿里云官方提供的磁盘扩容方法扩容会有报错: [root@iZ28u04wmy2Z ~]# e2fsck /dev/xvdb1 ...
- 云服务器启动tomcat巨慢,很慢
增加随机数生成熵池 0.查看熵池 cat /proc/sys/kernel/random/entropy_avail 1. yum install rng-tools 2. systemctl sta ...
- Java设计模式(18)策略模式(Strategy模式)
Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线, ...
- MyBatis错误:Result Maps collection already contains value for novel.storage.mapper.NovelMapper.BaseResultMap
今天在写项目的时候遇到一个问题如下: org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession. ...
- 【转】【Nginx】Nginx 入门教程 + 常用配置解析
== Nginx介绍和安装 == Nginx是一个自由.开源.高性能及轻量级的HTTP服务器及反转代理服务器, 其性能与IMAP/POP3代理服务器相当.Nginx以其高性能.稳定.功能丰富.配置简单 ...
- freetds设置超时
freetds的超时一般在其配置文件中有设置,实际上程序中也可以设置,动用两个api dbsetlogintime dbsettime 设置在dbopen之前,如下所示: 表示设置登录超时5秒,读写超 ...
- LintCode #3 统计数字
解题思路请参考 代码(可以通过,不过很乱,需要整理): /// <summary> /// 计算n在数组[targetNum]中出现的次数 /// 形如:[0, 1, 2, 3, 4, 5 ...
- 使用Camera功能 AREA的理解
转至 http://blog.csdn.net/think_soft/article/details/7998478 使用Camera功能 大多数的Camera功能都是使用Camera.Paramet ...