如果仅仅会LINQ基础,那么或许不能体会到LINQ功能的强大,当你了解LINQ to XML后,就不一样了......
一、LINQ to XML API
可扩展标记语言(XML)是存储和交换数据的重要方法,LINQ to XML可以以两种方式和XML配合使用。第一种是作为简化的XML操作API,第二种是使用LINQ查询工具。
从介绍LINQ to XML API开始
LINQ to XML API由很多XML树组件的类组成,如图所示
其中最重要的三个类为:XDocument、XElement和XAttribute,可以通过它们快速创建一棵XML树
using System; using System.Linq; using System.Text; using System.Xml.Linq; namespace 简单XML使用 { class Program { static void Main(string[] args) { XDocument xd = new XDocument( new XElement("MyXElement", new XElement("first", new XAttribute("color", "red"), new XAttribute("size", "small")), new XElement("second", new XAttribute("color", "green"), new XAttribute("size", "medium")), new XElement("third", new XAttribute("color", "blue"), new XAttribute("size", "large")))); Console.WriteLine(xd); Console.ReadKey(); } } }
对一些重要的类进行详细讲解(由于上面的例子中已经使用了下面的一些类,所以讲一些类的时候没有再继续举例子)
1.1 XDocument类
XDocument类提供了处理XML文档的方法,包括声明、注释和处理指令。
XDocument类可以包含0个或一个 XDeclaration节点、XDocumentType节点和XElement节点,还可以包含任意数量的XProcessingInstruction节点
如果XDocument中有最高级别的XElement节点,那么它就是XML树中其他元素的根,根元素可以包含任意数量的嵌套XElement、XComment或XProcessingInstruction节点
上图演示了用于构造XML树的类以及它们如何被嵌套 (嘻嘻,图有点丑,别见怪),需要注明的是图中“1”代表可以嵌套0个或一个,“n”表示任意个
1.2 XElement类
它表示一个 XML 元素。 可以使用该类创建元素、更改元素内容;添加、更改或删除子元素;向元素中添加属性;或以文本格式序列化元素内容。
1.3 XAttribute类
XAttribute类用来处理元素的特性,特性可以是与元素相关联的“名称-值”对,也可以接受现有的XAttribute的引用。每个元素中不能有名称重复的特性。
举个栗子。
using System;using System.Xml.Linq; namespace 简单XML使用 { class Program { static void Main(string[] args) { XDocument xd = new XDocument( //创建XML树 new XElement("root", new XAttribute("color", "red"), //添加XAttribute属性 new XAttribute("size", "large"), new XElement("first") ) ); Console.WriteLine(xd); XElement rt = xd.Element("root");//获取元素 XAttribute color = rt.Attribute("color");//获取特性 XAttribute size = rt.Attribute("size"); Console.WriteLine("color: {0}", color);//显式特性 Console.WriteLine("size: {0}", size.value); Console.ReadKey(); } } }
注意一个是直接输出color,另一个是size.value
1.4 XDeclaration类
XML声明,可以声明包含XML使用的版本号、字符编码类型以及文档是否依赖于外部引用。
new XDeclaration("2.0", "utf-8", "yes")
这段代码产生的XML文档为:<?xml version="2.0" encoding="utf-8" standalone="yes" ?>
1.5 XProcessingInstruction类
XML处理指令用于提供XML文档如何被使用和翻译的额外数据,最常见的就是把处理指令用于关联XML文档和一个样式表。
我们可以使用XProcessingInstruction构造函数来包含处理指令。它接受两个字符串参数:目标和数据串。如果处理指令接受多个数据参数,这些参数必须包含在XProcessingInstruction构造函数的第二个字符串中,如下面的代码所示。
new XProcessingInstruction("xml-stylesheet",@"href=""stories"", type=""text/css""")
产生的XML文档为: <?xml-stylesheet href="stories", type="text/css"?>
注意示例中第二个参数是一个字符串,在字符串中的双引号文本使用两个连续的双引号来表现
二、使用XML树的值
当我们遍历XML树来获取或修改值时才体现出XML的强大。下表给出了用于获取数据的主要方法
方法名称 | 类 | 返回类型 | 描述 |
Nodes | XDocument、XElement | IEnumerable<object> | 返回当前节点的所有子节点(不管是什么类型) |
Elements | XDocument、XElement | IEnumerable<XElement> | 返回当前节点的XElement子节点,或所有具有某个名字的子节点 |
Element | XDocument、XElement | XElement | 返回当前节点的第一个XElement子节点,或具有某个名字的子节点 |
Descendants | XElement | IEnumerable<XElement> | 返回所有的XElement子代节点,或所有具有某个名字的XElement子代节点,不管它们处于当前节点下嵌套的什么层次 |
DescendantsAndSelf | XElement | IEnumerable<XElement> | 和Descendants一样,不过包含当前节点 |
Ancestors | XElement | IEnumerable<XElement> | 返回所有上一级XElement节点,或者所有具有某个名字的上级XElement节点 |
AncestorsAndSelf | XElement | IEnumerable<XElement> | 和Ancestors一样,但包含当前节点 |
Parent | XElement | XElement | 返回当前节点的父节点 |
关于表中的方法,需要了解的一些重要事项如下:
a: Nodes Nodes方法返回IEnumerable<object>类型的对象,因为返回的节点可能是不同类型,比如XElement、XComment等。我们可以使用以类型作为参数的方法OfType(type)来指定返回某个类型的节点,下面代码只获取XComment节点
IEnumerable<XComment> comments = xd.Nodes().OfType<XComment>();
b: Elements 由于获取XElement是一个非常普遍的需求,就出现了Nodes.OfType<XElement>()表达式的简短形式-------Elements方法
使用无参数的Elements方法返回所有的子Elements。
使用单个name参数的Elements方法只返回具有这个名字的子XElements
IEnumerable<XElement> empPhone = emp.Elements("PhoneNumber");
Element用法与其类似
c: Descendants和Ancestors用法与Elements差不多,只不过它们不返回直接的子元素,而是忽略嵌套级别,包含所有之下或者之上的节点
三、操纵XML
LINQ to XML一个重要的特性是能够方便地修改xml树,下表列出了最重要的一些操纵XML的方法
方法名称 | 从哪里调用 | 描述 |
Add | 父节点 | 在当前节点的既有子节点后增加新的子节点 |
AddFirst | 父节点 | 在当前节点的既有子节点前增加新的子节点 |
AddBeforeSelf | 节点 | 在同级别的当前节点之前增加新节点 |
AddAfterSelf | 节点 | 在同级别的当前节点之后增加新节点 |
Remove | 节点 | 删除当前所选的节点及其内容 |
RemoveNodes | 节点 | 删除当前所选的XElement及其内容 |
SetElement | 父节点 | 设置节点内容 |
ReplaceContent | 节点 | 替换节点内容 |
让我们来看看这些方法怎么使用(注:下面的代码建立在前面的基础上)
3.1 添加
XElement rt = xd.Element("root"); rt.Add(new XElement("second", "2"));
执行后将在first节点后增加一个新节点
AddFirst等方法你们可以自己试试,这样更能加深印象,用法也差不多(不会告诉你是因为我太懒了不愿写的)
3.2 删除
XElement rt1 = rt.Element("second"); rt1.Remove();
上面代码将例2.1创建的节点删除。
也可以使用RemoveAll()方法
3.3 更新
在LINQ to XML中更新xml内容可以使用以下几种方法:
rt.Element("first").ReplaceWith(new XElement("NewFirst")); rt.SetElementValue("second", "two");
上述代码将名为first节点的名字改变为NewFirst,名为second节点的值设置为two
你若坚持,定会发光,时间是所向披靡的武器,它能集腋成裘,也能聚沙成塔,将人生的不可能都变成可能。
如果觉得文章不错,请点个赞吧!