Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

C# LINQ to XML

阡陌染 2019-01-28 09:13:00 阅读数:232 评论数:0 点赞数:0 收藏数:0

如果仅仅会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树组件的类组成,如图所示

其中最重要的三个类为:XDocumentXElementXAttribute,可以通过它们快速创建一棵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

 

  你若坚持,定会发光,时间是所向披靡的武器,它能集腋成裘,也能聚沙成塔,将人生的不可能都变成可能。

如果觉得文章不错,请点个赞吧!

 

版权声明
本文为[阡陌染]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/forever-Ys/p/10324833.html

编程之旅,人生之路,不止于编程,还有诗和远方。
阅代码原理,看框架知识,学企业实践;
赏诗词,读日记,踏人生之路,观世界之行;

支付宝红包,每日可领