前言: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())详细的过程请查阅相关资料以便更好的分析其过程.

最新文章

  1. EditBox问题的实现以及Junit测试框架的简要说明
  2. paip.基于navicate mysql的自动化报表工具总结
  3. [BS-20] 导航控制器和视图控制器在添加控制器的区别
  4. MyBatis核心配置文件模版
  5. 教程-delphi的开源json库:superobject,用法简介
  6. jsoup技术抓取网页数据大全
  7. Qt 技巧:去除对话框边框 + 设置窗口可移动和透明
  8. ●Joyoi 绿豆蛙的归宿
  9. 如何打印consul的错误信息
  10. html中script标签的使用方法
  11. Spring标签之Bean @Scope
  12. centos 6.8下载地址
  13. 理解 with递归调用 Sqlserver 树查询
  14. java.net.NoRouteToHostException
  15. ionic 2.x 3.x input触发调用键盘搜索及事件
  16. BZOJ4766:文艺计算姬(矩阵树定理)
  17. github不能访问、加载css、js解决办法
  18. [CTCI] 最大子方阵
  19. ThinkPHP 的一个神秘版本 ThinkPHP 1.2
  20. 操作数据----DML语句

热门文章

  1. 去掉 wap (android/ios)网页等点击后的阴影
  2. C#创建桌面快捷方式 和 开机启动
  3. jquery数组排序学习
  4. c#操作excel后关闭excel.exe的方法
  5. 二分查找算法java实现
  6. javascript 三个 对话框
  7. 简单查看tomcat中部署java服务的内存使用情况
  8. 配置SMarty解析
  9. Scrum会议3(Beta版本)
  10. C#中String.Empty,“”,NULL的区别