Linq世界走一走(LINQ TO XML)
前言:Linq to xml是一种使用XML的新方法.从本质上来说,它采用了多种当前使用的XML处理技术,如DOM和XPath,并直接在.NET Framework内将它们组合为一个单一的编程接口.Linq to xml提供了DOM中修改内存文档的功能,同时通过LINQ查询表达式提供了等同于XPath的查询功能.
System.Xml.Linq名称空间包含19个类,如下列出了它们的名称及其描述:
XAttribute:表示XML中的一个属性
XCData:表示一个CDATA文本节点
XComment:表示一个XML注释
XContainer:一个抽象基类,表示具有子节点的节点
XDeclaration:表示一个XML声明
XDocument:表示一个XML文档,该类派生自XContainer类
XDocumentType:表示一个XML DTD(文档类型定义)
XElement:表示一个XML元素,它是XContainer的派生类
XName:表示一个XML元素或属性的名称
XNamespace:表示一个XML名称空间
XNode:该抽象类表示XML元素树的节点
XNodeDocumentOrderComparer:根据节点在XML文档内的顺序对它们进行比较
XNodeEqualityComparer:根据节点的值对它们进行比较
XObject:表示XNodes和XAttributes的抽象类
XObjectChange:XObject事件发生时的事件类型
XObjectChangeEventArgs:为Changing和Changed事件提供信息和数据
XObjectChangeEventHandler:处理XObject中Changed和Changing事件的方法.
XProcessingInstruction:表示一个XML处理指令
XText:表示一个XML文本节点.
其中XElement,XAttribute,XDocument是用的最多的三个类
Linq to xml编程概念
Ⅰ处理已有的XML
将XML加载到LINQ TO XML树是很直观的.可以从多个数据源加载XML,如字符串,XMLReader,TextReader或文件
①XElement employess=null;employess=XElement.Load(@"C;\WROX");
②XElement employess=XElement.Parse(@"hello");此方法只能包含单个根节点
③也可以从TextReader加载XML.TextReader tr=new StringReader(@"people");XElement xel=XElement.Load(tr);tr.Close();xel.Save(@"C;\WROX");
这种保存通常称为序列化.如果加载到XML类的XML是经过缩进的,序列化的XML就将保持其格式,从而保持XML的缩进,任何无意义的空白将被删除.
Ⅱ创建XML
Linq to xml提供了一个功能强大但简单的办法来手工创建XML元素.如下:XElement xdoc=new XElement("Riders",new XElement("Riders",new XElement("name","Ricky Carmichael")));
在.NET Framework中,LINQ to XML的强大之处是自动生成缩进.这使得LINQ TO XML的可持续性更强,因为它模仿了xml的格式和结构
ⅢXML漫步
employees.Element("Employees").Element("Employee").Element("Name");
Nodes(),Elements(),Element(Name)和Elements(Name)方法为XML树的导航提供了基础和基本功能
Ⅳ操作XML
Linq to xml 一个主要的特性是能够方便地修改XML树,如添加,删除,更新和复制XML文档的内容.
修改XML树可以通过XNode类的多个方法来实现,Xnode类用来表示节点,如一个Xml树中的元素和注释.更多的时候,我们都是在节点层次上进行相关的处理,操纵元素和它们的内容或属性.
⑴插入(AddAfterSelf,AddBeforeSelf)
如:XElement zip=Employee.Element("Employee").Element("State");
zip.AddAfterSelf(new XElement("Zip","33142"));
⑵更新
使用Linq相当简单,删除元素,加入另一个元素以及改变一个元素的内容都有多种方法可以使用.Replace方法提供了几个可供选择的选项
1.ReplaceWith---用指定的内容来取代当前元素的内容.
2.ReplaceAll---用指定的内容取代当前元素的子节点及相关的属性
3.ReplaceNodes---用指定的内容来取代文档或当前元素的子节点.
⑶删除
删除XML很简单,只要导航到要删除的内容,然后调用Remove()或RemoveAll()方法即可.
Ⅴ处理属性
属性是与一个XML元素关联的名称/值对.现在您已经了解了相当多的使用XElement类来处理元素的方法,与之相比,通过XAttibute类来处理属性并没有太大的不同.以下将解释如何在XML树中处理属性.明确的说,就是如何添加,检索和删除属性
⑴添加
通过LINQ to XML添加属性与添加元素是类似的.可以使用XML构造函数来添加属性.
⑵检索
检索属性也很容易.它涉及使用XElement类的Attibute(XName)方法.例如,下面的代码定义了一个XML树,树中包含了几个定义在Employee节点上的属性.然后使用XElement类的Attributes()方法检索这些属性.
⑶删除
删除属性有两种选择.第一种是使用Remove()方法.第二种是使用SetAttributeValue方法.当使用此方法时,可以设定属性值(名称/值对)为空.如下所示
employee.Element("Employee").SetAtributeValue("EyeColor",null);
当要处理大量结构差异较小的XML文档,并且这些文档需要被快速处理时,XmlReader是最适合的.当各个文档的XML树结构不同时,可以选择LINQ TO XML,这也是LINQ TO XML的闪光点
Linq to xml与MSXML的比较
LINQ TO XML和MSXML之间一个大的差异在于MSXML是基于COM的,因此,不建议在托管代码中使用MSXML.MSXML也包含了DOM的本地实现,并包括对XSLT和XPath的支持.它主要用于支持COM的编程语言.相反,LINQ TO XML不基于COM,它是专为使用托管代码而设计的.因此,我们可以获取托管代码的所有优点,如垃圾回收,类型安全以及面向对象的设计特性.
LINQ to XML编程
Linq to XML具有许多优势,其中最具有价值的是快速,容易地创建XML文档和XML树的能力.LINQ TO XML为开发人员创建,修改和操纵XML树提供了多种不同的选择.
c#中树的创建
在c#中使用XElement类来创建XML树.这个类提供了创建和操纵XML文档以及XML树所需要的全部功能.XElement类最简单的形式是创建元素.下面是创建一个空元素的示例:XElement emptyElement=new XElement("Employee");结果就是
最常见使用方式:XElement emptyElement=new XElement("Employee",new XElement("Name","Scott"));
序列化XML树
序列化是指将一个对象保存到存储介质(如文件或是内存)中的过程.序列化一个XML树是指由树生成XML文本的过程.新生成的XML可以序列化到一个文件或一个TextWriter或XmlWriter的实现.当使用LINQ TO XML序列化XML时,默认情况下XML树中毫无意义的空白将不会保留.例如,若使用没有空白的文本节点读取缩进的XML,那么之后在序列化XML时使用缩进将不会保留空白
XML名称空间
通过使用名称空间,可以避免XML文档不同部分之间的命名冲突.除了唯一限定名称之外,名称空间也用于实现XML文档中的前缀.前缀可以让您使用XML名称空间的缩写,从而使XML文档更具有可读性,更简洁.使用前缀不利的一方面是其含义依赖于上下文.一个前缀在XML树中的不同部分可与不同的名称空间相关联,这使得它们的含义更难理解.
linq to xml和其他LINQ数据模型
简而言之,就是sql数据库和xml数据源都可以通过LIQN来单一处理.
LINQ的强大特性之一是其灵活性.Linq有很多长处,其中一个是它为不同的数据模型(LINQ,LINQ TO XML以及LINQ TO SQL)提供了一致性的能力,这是通过标准查询操作符和.NET Framework中的新Lambda表达式来实现的,Lambda可以用在任何需要委托类型的位置上的内联语句块或表达式.Lambda表达式是使用简洁语法来编写的,可以用在任何能够使用匿名方法的地方,如作为一个方法调用的参数.
LINQ另一个重要的特性是,它于基于LINQ的数据模型(如LINQ TO SQL)可以很容易地进行交互.这种能力是通过LINQ API提供的.它使开发人员能够将不同的LINQ数据模型相结合,从而构造出可使用两种模型组件的单一的查询表达式.
linq to xml编程高级主题
①函数构造
②批注
③轴
④事件
⑤流式处理文档和片段
①函数构造是指通过单个语句构建XML树的能力.之前都是介绍了如何使用XElement和XAttribute类手工构造XML树.可以使用这些类的构造函数在单个语句内简单,有效地构建XML树.不过,函数构造可以实现更多的功能,而不仅仅是前面例子所示的手工构建XML.在修改和操纵XML时,函数构造采取的是另一种完全不同的途径.在当前的XML技术中,操纵和修改XML通常是指对XML数据源进行重大而详细的修改.而LINQ TO XML把XML的修改仅仅当作一个转换问题:可以读取一个XML数据源并有效地将其从一种形式转换成另一种形式.
例如:XElement newXML=new XElement("Info",new XElement("CurrentDate",DateTime.Today),new XElement("supervisor","Jim"),from e1 in employees.Elements("Employee").Elements("Name") where (string)e1=="liu") select e1);
函数构造的强大之处在于可以通过查询表达式容易地控制所构建的XML树.函数构造提供了一个更为有效和健壮的方式来修改XML树和文档,因为它把数据的修改视为一个转换问题而不是视为对数据源的修改或操纵.函数构造的关键是将LINQ查询的结构传递给XElement或XDocument的构造函数.虽然在某些情况下这种方法可能不再这么简单,尤其是对大型XML文档来说,但跟其他方法来比的话,函数构造仍然能提供更多的好处,如产生的代码更容易维护和阅读.函数构造使其本身具有更高的效率,而不受限于XML文档的大小.
②LINQ TO XML批注
通俗的讲,批注是与一段文本相关联的说明性的注释.LINQ TO XML中的批注并没有什么不同,他是指将一个对象添加或关联到一个XML节点或属性的能力.批注可以是任意类型的任何对象.在LINQ to XML中,批注是指为一个XNode对象提供的,类型为Object的对象所组成的链表.
可以通过XElement和XAttribute类的AddAnnotation方法来添加批注.当调用此方法时,一个新的对象将被添加到XML树中相应的XObject对象(元素或属性)上.要使用批注,首先需要为添加和定义批注创建一种机制.例如,下面的代码为添加整个数据类型的批注定义了一种机制
public class TestAnnotation
{
private int all;
public int all{get {return all;} set {val=value}}
public TestAnnotation(int all)
{
this.all=all;
}
}
③LINQ to XML轴
假如要返回多个节点的值该怎么实现呢?例如,加入要返回所有的FirstName元素,何解?
LINQ TO XML通过提供轴方法提供了这种能力,轴方法是属于XElement类的方式,每个方法返回一个IEnumerable集合.这些方法可用于返回节点中结构化的或复杂的内容.如子元素和上级元素.轴方法主要有以下几种:
⑴Ancestors 返回指定节点的之上的所有上级元素
⑵Descendants 指定了向前搜索的起点.返回由当前元素的所有后继元素构成的一个类型为XElement的IEnumerable对象.因此,它实际上取决所选择的处理问题的方法.
⑶AncestorsAndSelf 返回的是当前元素及其上级元素.
⑷DescendantsAndSelf 返回当前元素及其后继元素.
⑸ElementAfterSelf 返回指定元素之后的元素.
⑹ElementBeforeSelf 返回指定元素之前的元素.
④LINQ to XML事件
当对XML树进行修改时,LINQ to xml事件会提供通知.LIQN提供了两种事件来处理XML树的变更:Changing和Changed.当修改XML树时这两个事件都会被触发
⑴Changing事件
Changing事件发生在对XOject或其任何后继对象应用任何更改应用之前.换言之,当一个元素或属性,或其任何后继节点即将改变时会触发此事件.当要求改变XML树中的一个元素时,将会触发Changing事件.
XElement x=new XElement("........") x.Changing+=new XObjectChangeEventHandler(delegate(object xsender,XObjectChangeEventArgs cea)){ say"hello world"}; 此时,因为是根节点发生了改变,所有有任何改动都将导致时间的触发.
⑵Changed事件
当某个XObject或其任何后继节点发生该改变后,会触发Changed事件.换言之,当一个元素或属性,或其任何后继元素发生更改时都会触发事件.定义事件和Changing定义事件一致.通过输出可以看到每次触发事件,事件都被执行了两次,因为会先删除,然后添加
1.在构造函数中是不可能接收事件的
2.不推荐在触发事件中的执行过程修改XML树,因为这会导致意想不到的结果.不过可以修改另一个XML树.
⑤流式处理XML文档
当处理较大型的XML文档时,可以利用这个.流式处理XML文档时需要用XmlReader类从一个XML源读取数据,并建立一个很小的XML片段,然后对此片段进行处理.这将会减少内存的使用量.其中的关键是,使用XMlReader类快速遍历XML文档以寻找所需要的节点.然后调用ReadFrom()方法从源XML读取信息并将其填充到目标XML片段.
XmlReader读取源:XmlReader reader=XmlReader.Create(uri);reader.MoveToContent();然后就是While(reader.read())详细的过程请查阅相关资料以便更好的分析其过程.
Linq世界走一走(LINQ TO XML)的更多相关文章
- Linq世界走一走
什么是Linq?它是用来做什么的?怎么用? Linq的优点是不管数据源是什么,都可以统一查询.换言之,它是一种包含一套标准查询操作符的查询语言,可以对多个数据源进行查询 ⑴Linq俗称语言集成查询(L ...
- linq世界走一走(LINQ TO SQL)
前言:作为linq的一个组件,同时作为ADO.NET的一个组成部分,LINQ TO SQL提供了将关系数据映射为对象的运行时基础结构. LINQ TO SQL是通过将关系数据库对象的数据模型(如一个数 ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- Linq之旅:Linq入门详解(Linq to Objects)【转】
http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html Linq之旅:Linq入门详解(Linq to Objects) 示例代码下载:Linq之 ...
- Linq之旅:Linq入门详解(Linq to Objects)(转)
http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html 示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细 ...
- 白话LINQ系列1---什么是LINQ?
一.本系列目标 1.理解LINQ: 2.能写得复杂的LINQ语句(比如:动态查询): 3.理解表达式树及相关概念: 4.熟练运用LINQ写出优美的代码(希望一起努力,最终达到): 二.LINQ为何物? ...
- linq字符串搜索条件,排序条件-linq动态查询语句 Dynamic LINQ
在做搜索和排序的时候,往往是前台传过来的字符串做条件,参数的数量还不定,这就需要用拼sql语句一样拼linq语句.而linq语句又是强类型的,不能用字符串拼出来. 现在好了,有个开源的linq扩展方法 ...
- LINQ之路16:LINQ Operators之集合运算符、Zip操作符、转换方法、生成器方法
本篇将是关于LINQ Operators的最后一篇,包括:集合运算符(Set Operators).Zip操作符.转换方法(Conversion Methods).生成器方法(Generation M ...
- LINQ to Entities 不支持 LINQ 表达式节点类型“ArrayIndex”
我就不屁话,能一张图就解决的就不说话了 2015-03-28 14:53:24,440 [10] ERROR log - System.NotSupportedException: LINQ to E ...
随机推荐
- RETINA显示屏下ICON优化方法
便于理解,先来了解几个名词: dpi(dots per inch),每英寸的点数,用来测量任何设备的硬件分辨率.一个21”的屏幕可以拥有1680 X 1050 的分辨率,27”的屏幕也可以拥有相同的分 ...
- Linq To Objects
一.什么是Linq To Objects 从根本上说,Linq To Objects表示一种新的处理集合的方法.采用旧方法,必须编写指定如何从集合检索数据的复杂的foreach循环.而采用Linq方法 ...
- const放在函数前和放在函数后
template < class T, class container = vector<T> > class MyClass{ private: T value; publi ...
- TYVJ P1013 找啊找啊找GF Label:动态规划
做题记录:2016-08-15 22:19:04 背景 MM七夕模拟赛 描述 "找啊找啊找GF,找到一个好GF,吃顿饭啊拉拉手,你是我的好GF.再见.""诶,别再见啊.. ...
- SQL Server 中 with tmp 临时表的用法
SQL Server 中 with tmp 临时表的用法 ----------with临时表用法,有时候采用临时表比采用in的效率更高,避免了全表扫描. 实例中实现了查询普通题.大题.子题目的sql ...
- 最基本的session保存法,类似于默认的files方法
关于session的几个补充函数 在PHP下,关于session的讨论很多,其实在PHP4中还有几个函数是我们平时没有注意到的. 下面我把它们介绍给大家吧. 其中的session_set_save_h ...
- 通过SEP屏蔽共享文件夹
Go to Policies – Application and Device Control. Select default Application and Device Control polic ...
- 【液晶模块系列基础视频】1.1.iHMI43模块介绍
[液晶模块系列基础视频]1.1.iHMI43模块介绍(上) [液晶模块系列基础视频]1.1.iHMI43模块介绍(下) ============================== 技术论坛:http ...
- ERROR com.opensymphony.xwork2.interceptor.ParametersInterceptor.error:34 - Developer Notification
We are trying to migrate from Struts 2.2 to Struts 2.3, after getting to run the project I am seeing ...
- [杂谈]交通工具orca card
How and Where to Use the ORCA Card The Microsoft ORCA card provides unlimited rides on all buses, tr ...