如果仅仅会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

C# LINQ to XML相关推荐

  1. LINQ to XML 建立,读取,增,删,改

    LINQ to XML的出现使得我们再也不需要使用XMLDocument这样复杂的一个个的没有层次感的添加和删除.LINQ可以使的生成的XML文档在内存中错落有致.下面以一个小的例子说名LINQ to ...

  2. Linq初级班 Linq To XML体验(基础篇)

    LINQ To XML体验(基础) 这两天开始学习LINQ to XML的知识,我会继续把自己的感想和示例发布给初学者们学习的,一样欢迎高手们多多指点,请勿使用过激语言,针锋相对,我是个初学者,自知还 ...

  3. LINQ之路19:LINQ to XML之X-DOM更新、和Value属性交互

    本篇包含两部分内容:X-DOM更新一节中我们会详细讨论LINQ to XML的更新方式,包括Value的更新.子节点和属性的更新.通过Parent节点实现更新: 和Value属性交互一节会详细讨论XE ...

  4. LINQ to XML 常用操作(转)

    查找具有特定属性的元素 XElement root = XElement.Load("PurchaseOrder.xml"); IEnumerable<XElement> ...

  5. Linq To Xml学习 - 1.LINQ to XML 概述

    LINQ to XML 是一种启用了 LINQ 的内存 XML 编程接口,使用它,可以在 .NET Framework 编程语言中处理 XML. 它将 XML 文档置于内存中,这一点很像文档对象模型 ...

  6. [Linq]Linq To Xml (待整理)

    [Linq]Linq To Xml (待整理) Linq To Xml (待整理) posted on 2012-02-28 10:38 水墨.MR.H 阅读(...) 评论(...) 编辑 收藏 转 ...

  7. LINQ to XML .Net 3.5 中的新XML对象

    System.Xml.Linq 命名空间中,有一系列新的LINQ to XML 帮助对象,使处理内存中的XML文档变的非常简单. 示例使用的Hamlet.xml来源自C#高级编程源代码. XDocum ...

  8. 24.C#LINQ TO XML(十二章12.3)

    自己也写了那么多,但还有很多不懂,有点浮躁吧,但饭还是要吃啊,说说LINQ TO XML吧. LINQ TO XML位于System.Xml.Linq程序集,并且大多数类型位于System.Xml.L ...

  9. 用linq查询html中div个数,C#使用Linq to XML进行XPath查询

    最近在用到HtmlAgliltyPack进行结点查询时,发现这里选择结点使用的是XPath.所以这里总结一下在C#中使用XPath查询XML的方式.习惯了用Linq,这里也是用的Linq to xml ...

  10. 一个简单的LINQ TO XML, AJAX 例子[译]

    这个教程是用Visual Studio.net 2008建立,也可以使用VS2005,但你需要从这里下载安装Microsoft's ASP.NET AJAX Extensions,AJAX和LINQ是 ...

最新文章

  1. 在 ASP.NET MVC 中使用 Chart 控件
  2. JZOJ 3.10 1540——岛屿
  3. wpf开发仿真3d软件_web 3d 与仿真
  4. strictmath_Java StrictMath hypot()方法与示例
  5. 沉浸式全息本是什么_够炫酷!联想全息教学设备,构建沉浸式教学场景
  6. 可靠型园区网组网,用VRRP还是堆叠?
  7. 四、Python-元组
  8. non linear processor
  9. angularjs html编码,怎样使用AngularJS实现base64编码与解码
  10. C#基础知识(收藏)
  11. 一些有用的收藏201808
  12. fsearch:适用于linux的快速查找软件(类似everything)安装教程
  13. 2017_Generating high-quality crowd density maps using contextual pyramid cnns
  14. 世界上第一台电子计算机名称叫什么,世界上第一台电子计算机的名字是什么
  15. SQL语句查询出现异常,SQL语句:*** 给定关键字不在字典中。
  16. 世界线(bzoj2894)(广义后缀自动机)
  17. 计算机access分数比例,[access查询]关于分数段统计问题
  18. 打开matlab只出现蓝色的界面,win10 windows设置无法打开总卡在纯蓝色界面如何解决...
  19. CSS实现DIV块的阴影效果
  20. SQL实战45.将titles_test表名修改为titles_2017

热门文章

  1. 并发编程学习之延时队列DelayQueue
  2. spring源码--第七个后置处理器的使用:初始化方法
  3. Spring整合MyBatis之SqlSessionFactory对象的产生
  4. LeetCode-11-Container With Most Water
  5. SpringCloud之Hystrix断路器以及dashboard 属性详解
  6. XML安全之Web Services
  7. JS浏览器对象-Location对象
  8. 第三回:羁旅客忆碌碌旧事 暴雨天里依依惜别[林大帅作品连载]
  9. 高性能 TCP UDP 通信框架 HP-Socket v3.3.1
  10. 《3D数学基础系列视频》1.2向量的数乘和加减法