LINQ TO XML 笔记

来源:http://msdn.microsoft.com/zh-cn/library/bb387098.aspx

什么是LINQ to XML?

LINQ to XML 是一种启用了 LINQ 的内存 XML 编程接口,使用它,可以在 .NET Framework 编程语言中处理 XML。

LINQ to XML 将 XML 文档置于内存中,这一点很像文档对象模型 (DOM)。?您可以查询和修改 XML 文档,修改之后,可以将其另存为文件,也可以将其序列化然后通过 Internet 发送。?但是,LINQ to XML 与 DOM 不同:它提供一种新的对象模型,这是一种更轻量的模型,使用也更方便,这种模型利用了 Visual C# 2008 在语言方面的改进。

LINQ to XML 最重要的优势是它与 语言集成查询 (LINQ) 的集成。?由于实现了这一集成,因此,可以对内存 XML 文档编写查询,以检索元素和属性的集合。?LINQ to XML 的查询功能在功能上(尽管不是在语法上)与 XPath 和 XQuery 具有可比性。?Visual C# 2008 集成 LINQ 后,可提供更强的类型化功能、编译时检查和改进的调试器支持。

LINQ to XML 的另一个优势是通过将查询结果用作?XElement?和?XAttribute?对象构造函数的参数,实现了一种功能强大的创建 XML 树的方法。?这种方法称为“函数构造”,利用这种方法,开发人员可以方便地将 XML 树从一种形状转换为另一种形状。

LINQ to XML 与其他 XML 技术

下面将 LINQ to XML 与下面的 XML 技术进行比较:XmlReader、XSLT、MSXML 和 XmlLite。?了解这些信息,有助于确定要使用哪种技术。

LINQ to XML 与XmlReader

XmlReader?是一种快速的只进非缓存分析器。

LINQ to XML 在?XmlReader?基础之上实现,它们紧密集成在一起。?但是,您也可以单独使用?XmlReader

例如,假设要生成一项 Web 服务,该服务每秒将分析几百个 XML 文档,而这些文档具有相同的结构,因此,只需编写一种代码实现即可对 XML 进行分析。?在这种情况下,您可能希望单独使用?XmlReader

相反,如果要生成一个系统,用以分析多种小型 XML 文档,而这些文档各不相同,则可能希望利用 LINQ to XML 提高工作效率。

LINQ to XML 与XSLT

LINQ to XML 和 XSLT 都提供丰富的 XML 文档转换功能。?XSLT 是基于规则的声明性方法。?XSLT 高级程序员以函数编程方式编写 XSLT,这种方式强调无状态方法。?可以使用实现后无副作用的纯函数编写转换。?许多开发人员还不熟悉这种基于规则的方法(即函数方法),需要付出努力和花费大量时间来学习这项技术。

XSLT 是非常高效的系统,可以生成高性能的应用程序。?例如,一些大型 Web 公司使用 XSLT 从 XML(提取自很多数据存储区)生成 HTML。?托管 XSLT 引擎将 XSLT 编译为 CLR 代码,在某些情况下,其性能甚至比本机 XSLT 引擎还要好。

但是,XSLT 没有利用许多开发人员都具备的 C# 和 Visual Basic 知识。?它要求开发人员用一种不同的复杂编程语言来编写代码。?如果使用两种非集成开发系统,例如 C#(或 Visual Basic)和 XSLT,软件系统的开发和维护会更加困难。

掌握 LINQ to XML 查询表达式之后,LINQ to XML转换就是一项功能强大、易于使用的技术。?本质上,XML 文档是这样形成的:使用函数构造,从各种源提取数据,动态构造?XElement?对象,再将全部内容组合到一个新 XML 树中。?经过这种转换,可以生成一个全新的文档。?相对来说,在 LINQ to XML 中构造转换比较容易、直观,编写出的代码可读性也较强。?这样可以减少开发和维护成本。

LINQ to XML 不是用来替代 XSLT 的。?对于复杂的以文档为中心的 XML 转换,XSLT 仍是很好的工具,如果文档结构的定义不完备,更是如此。

XSLT 的优势在于符合万维网联合会 (W3C) 标准。?如果要求只使用符合标准的技术,XSLT 可能更为合适。

XSLT 是 XML,因此可以以编程方式进行操作。

LINQ to XML 与MSXML

MSXML 是基于 COM 的技术,用于处理 Microsoft Windows 提供的 XML。?MSXML 提供 DOM 的本机实现,并且支持 XPath 和 XSLT。?它还包含基于事件的 SAX2 非缓存分析器。

MSXML 性能良好,默认情况下,在大多数情况中都是安全的,在 Internet Explorer 中可以利用此功能来执行 AJAX 式应用程序中的客户端 XML 处理。?在任何支持 COM 的编程语言(包括 C++、JavaScript 和 Visual Basic 6.0)中,都可以使用 MSXML。

建议不要在基于公共语言运行库 (CLR) 的托管代码中使用 MSXML。

LINQ to XML 与XmlLite

XmlLite 是一种只进非缓存提取型分析器。?开发人员主要将 XmlLite 用于 C++。?建议开发人员不要将 XmlLite 用于托管代码。

XmlLite 的主要优势在于它是快速的轻量 XML 分析器,在大多数方案中都是安全的。?它可能受到的威胁很少。?如果必须分析不受信任的文档,并且要预防受到拒绝服务或数据暴露等攻击,则 XmlLite 可能是很好的选择。

XmlLite 未与 语言集成查询 (LINQ) 集成。?它不会使程序员的工作效率得到提高,而工作效率提高正是 LINQ 背后的推动力量。

LINQ to XML 与 DOM

参阅:http://msdn.microsoft.com/zh-cn/library/bb387021.aspx

?LINQ to XML编程指南

LINQ to XML 非常依赖于泛型类。?因此,了解泛型类的使用非常重要。?此外,熟悉作为参数化类型声明的委托也很有帮助。?如果您不熟悉 C# 泛型类,请参见泛型类(C# 编程指南)

LINQ to XML 编程概述

LINQ to XML 同时支持以下这两种方法:

  • 使用声明性方法的函数构造——编写可采用源文档并生成具有所需形状的全新结果文档的转换。

  • 使用过程代码的内存中 XML 树修改法——编写可遍历内存中 XML 树节点并在其中导航以便根据需要插入、删除和修改节点的代码。

可以对任一方法使用 LINQ to XML。?使用的类相同,在某些情况下使用的方法也相同。?但这两种方法的结构和目标却大相径庭。?例如,在不同情况下,其中一种方法通常具有更好的性能,使用更多或更少的内存。?另外,其中一种方法会更容易编写并生成更容易维护的代码。

若要查看这两种相对比的方法,请参见内存中 XML 树修改与函数构造 (LINQ to XML)

有关编写函数转换的教程,请参见?XML 的纯函数转换

LINQ to XML 类概述

XAttribute 类

XAttribute?表示一个 XML 属性。属性是与元素关联的名称/值对。

构造函数

说明

XAttribute(XName name, object content)

创建一个?XAttribute?对象。?name?参数指定属性的名称;content?指定属性的内容。

属性与元素之间有些区别。?XAttribute?对象不是 XML 树中的节点。?它们是与 XML 元素关联的名称/值对。?与文档对象模型 (DOM) 相比,这更加贴切地反映了 XML 结构。虽然?XAttribute?对象实际上不是 XML 树的节点,但使用?XAttribute?对象与使用?XElement?对象非常相似。

XCData 类

XCData?表示一个 CDATA 文本节点。

构造函数

属性

名称 说明
BaseUr 获取此?XObject?的基 URI。?(继承自?XObject。)
Document 获取此?XObject?的?XDocument?(继承自?XObject。)
NextNode 获取此节点的下一个同级节点。?(继承自?XNode。)
NodeType 获取此节点的节点类型。?(重写?XText.NodeType。)
Parent 获取此?XObject?的父级?XElement?(继承自?XObject。)
PreviousNode 获取此节点的上一个同级节点。?(继承自?XNode。)
Value 获取或设置此节点的值。?(继承自?XText

方法

名称 说明
AddAfterSelf(Object) 紧跟在此节点之后添加指定的内容。?(继承自?XNode。)
AddAfterSelf(Object()) 紧跟在此节点之后添加指定的内容。?(继承自?XNode。)
AddAnnotation 将对象添加到此?XObject?的批注列表。?(继承自?XObject。)
AddBeforeSelf(Object) 紧邻此节点之前添加指定的内容。?(继承自?XNode。)
AddBeforeSelf(Object()) 紧邻此节点之前添加指定的内容。?(继承自?XNode。)
Ancestors 返回此节点的上级元素的集合。?(继承自?XNode。)
Ancestors(XName) 返回此节点的经过筛选的上级元素的集合。?集合中只包括具有匹配?XName?的元素。?(继承自?XNode。)
Annotation(Type) 从此?XObject?获取指定类型的第一个批注对象。?(继承自?XObject。)
Annotation(Of?T) 从此?XObject?获取指定类型的第一个批注对象。?(继承自?XObject。)
Annotations(Type) 获取此?XObject?的指定类型的批注集合。?(继承自?XObject。)
Annotations(Of?T) 获取此?XObject?的指定类型的批注集合。?(继承自?XObject。)
CreateReader 创建此节点的?XmlReader?(继承自?XNode。)
CreateReader(ReaderOptions) 使用?readerOptions?参数指定的选项创建?XmlReader?(继承自?XNode。)
ElementsAfterSelf 按文档顺序返回此节点后的同级元素集合。?(继承自?XNode。)
ElementsAfterSelf(XName) 按文档顺序返回此节点后经过筛选的同级元素的集合。?集合中只包括具有匹配?XName?的元素。?(继承自?XNode。)
ElementsBeforeSelf 按文档顺序返回此节点前的同级元素集合。?(继承自?XNode。)
ElementsBeforeSelf(XName) 按文档顺序返回此节点前经过筛选的同级元素的集合。?集合中只包括具有匹配?XName?的元素。?(继承自?XNode。)
Equals(Object) 确定指定的对象是否等于当前对象。?(继承自?Object。)
Finalize 允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。?(继承自?Object。)
GetHashCode 作为默认哈希函数。?(继承自?Object。)
GetType 获取当前实例的?Type?(继承自?Object。)
IsAfter 确定当前节点是否按文档顺序显示在指定节点之后。?(继承自?XNode。)
IsBefore 确定当前节点是否按文档顺序显示在指定节点之前。?(继承自?XNode。)
MemberwiseClone 创建当前?Object?的浅表副本。?(继承自?Object。)
NodesAfterSelf 按文档顺序返回此节点后的同级节点的集合。?(继承自?XNode。)
NodesBeforeSelf 按文档顺序返回此节点前的同级节点的集合。?(继承自?XNode。)
Remove 从节点父级中删除此节点。?(继承自?XNode。)
RemoveAnnotations(Type) 从此?XObject?移除指定类型的批注。?(继承自?XObject。)
RemoveAnnotations(Of?T) 从此?XObject?移除指定类型的批注。?(继承自?XObject。)
ReplaceWith(Object) 使用指定的内容替换此节点。?(继承自?XNode。)
ReplaceWith(Object()) 使用指定的内容替换此节点。?(继承自?XNode。)
ToString 返回此节点的缩进 XML。?(继承自?XNode。)
ToString(SaveOptions) 返回此节点的 XML,还可以选择禁用格式设置。?(继承自?XNode。)
WriteTo 将此 CDATA 对象写入?XmlWriter?(重写?XText.WriteTo(XmlWriter)。)

发表回复