来源: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 文本节点。
构造函数
- XCData(String)? 初始化?XCData?类的新实例。 String -??XCData?节点的值。
- XCData(XCData) 初始化?XCData?类的新实例。 XCData?-?要从其复制的?XCData?节点。
属性
名称 | 说明 | |
---|---|---|
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)。) |