日期:2014-04-02  浏览次数:20966 次

毫无疑问,XML 及其一些相关技术(包括 XPath、XSL Transformation 和 XML Schema)是 ADO.NET 的基础。与 ADO 相比,ADO.NET 对象模型的互操作性得到很大的提高,而理想上,XML 正是为此发挥重要作用的关键元素。在 ADO 中,XML 只是一个用于保留断开连接的记录集的内容的(非默认)I/O 格式。而 XML 在 ADO.NET 的构建和交互方面的参与则深入得多。可以用以下几点来概括 ADO.NET 与 XML 的更强的交互和集成:

• 对象序列化和近程处理
 
• 双编程接口
 
• XML 驱动的批处理更新(仅适用于 SQL Server 2000) 
 

在 ADO.NET 中,您可以用若干种方法将对象保存到 XML 文档以及从 XML 文档还原对象。总之,这种能力只属于 DataSet 对象,但可以用最少的代码扩展到其他容器对象。将诸如 DataTable 和 DataView 这样的对象保存到 XML 实质上可视为数据集序列化的特殊情况。

此外,ADO.NET 和 XML 类提供了一种统一的两头 API,程序员可通过同步的双编程接口来使用它。您可以使用 XML 基于节点的分层法或基于列的表格式数据集关系法来访问和更新数据。您可以在任何时候从数据的数据集表示方式切换到 XML DOM,反之亦然。数据将进行同步,而且您在其中一个模型中输入的任何更改会立即在另一个模型中有所反映,并可以看见。在本文中,我将讨论 ADO.NET 到 XML 的序列化和 XML 数据访问,也就是上面列表中的前两点。下个月,我将次要讨论 XML 驱动的批处理更新 — 您从 SQL Server 2000 XML Extensions (SQLXML 2.0) 获得的最酷特性之一。

 

数据集和 XML
就像任何其他 .NET 对象一样,DataSet 对象以二进制格式存储在内存中。不过,与其他对象不同的是,数据集一直以一种名为 DiffGram 的特殊XML 格式来进行近程处理和序列化。当数据集进入使用程序域的边界或计算机的物理边界时,会自动呈现为 DiffGram。在目标端,无提示地重新构建数据集为二进制对象,并可以立即便用。使用程序可以通过一组方法来使用同样的序列化功用,其中的一对方法显然非常突出。它们是 ReadXml 和 WriteXml。下表显示了您可以用来在读写中使用 XML 的数据集的方法。


GetXml
 • 前往一个字符串,该字符串是数据集中存储的数据的 XML 表示方式
 
• 不包括任何架构信息
 
 
GetXmlSchema
 • 前往一个字符串,该字符串是数据集的 XML 架构信息
 
 
ReadXml
 • 使用从流或文件读取的指定 XML 数据填充 DataSet 对象
 
 
ReadXmlSchema
 • 将指定的 XML 架构信息加载到当前的 DataSet 对象
 
 
WriteXml
 • 写入表示数据集的 XML 数据(或架构)
 
• 可以写入流或文件
 
 
WriteXmlSchema
 • 写入字符串,该字符串是数据集的 XML 架构信息
 
• 可以写入流或文件 
 
 

正如上表所示,使用 DataSet 和 XML 时,您可以将数据和架构信息作为不同的实体进行管理。您可以接受来自数据集的 XML 架构,将它作为字符串使用。您也可以将它写入磁盘文件或将它加载到一个空的 DataSet 对象。与上表中列出的方法可以相提并论的是,DataSet 对象还包含两个与 XML 相关的属性 — Namespace 和 Prefix。Namespace 确定将 XML 属性和元素读取到数据集时用于限定其范围的 XML 命名空间。作为命名空间别名的前缀存储在 Prefix 属性中。

前往页首
从 XML 构建数据集
ReadXml 方法填充从多个源读取的 DataSet 对象,这些源包括磁盘文件、.NET 流或 XmlReader 对象的实例。该方法可以处理任何类型的 XML 文件,但是,如果 XML 文件具有构形相当不规则的非表格式结构,则在以列和行的格式呈现时,当然可能产生一些问题。

ReadXml 方法有几个重载,所有这些重载都十分类似。它们接受 XML 源以及可选的作为参数的 XmlReadMode 值。例如:

public XmlReadMode ReadXml(String, XmlReadMode);

该方法依据指定的读模式以及数据集中能否已存在架构来为数据集创建关系架构。下面的代码片段显示了用于从 XML 加载数据集的典型代码。

StreamReader sr = new StreamReader(fileName);
DataSet ds = new DataSet();
ds.ReadXml(sr);   // defaults to XmlReadMode.Auto
sr.Close();

将 XML 源的内容加载到数据集时,ReadXml 不合并其主键信息相婚配的行。要将现有的数据集与从 XML 加载的数据集合并,首先必须创建一个新的数据集,然后使用 Merge 方法合并这两个数据集。在合并期间,所要覆盖的行就是那些具有相婚配的主键的行。您也可以使用另一种方法将现有的 DataSet 对象与从 XML 读取的内容进行合并,即通过 DiffGram 格式(稍后将详细讨论)。

下表解释了 ReadXml 支持的多个读模式。您可以使用 XmlReadMode 枚举对它们进行设置。


IgnoreSchema
 忽略任何嵌入式架构,而依托数据集的现有架构
 
ReadSchema
 读取任何嵌入式架构,并加载数据和架构
 
InferSchema
 忽略任何嵌入式架构,并从 XML 数据推断架构
 
DiffGram
 读取 DiffGram,并将数据添加到当前架构
 
Fragment
 读取和添加 XML 片段,不断到流的结尾 
 

默认的读模式没有在表中列出,这就是 XmlReadMode.Auto。设置此模式时,或者尚未显式设置任何读模式时,ReadXml 方法将检查 XML 源并选择最适合的选项。

如果发现 XML 源是 DiffGram,则将源作为 DiffGram 加载。如果源正好包含嵌入式架构或对外部架构的援用,将使用 ReadXmlSchema 来加载源。最后,如果 XML 源中不存在任何架构信息,则 ReadXml 方法使用数据集的 InferXmlSchema 方法推断架构。数据集的关系结构(即架构)由表、列、约束和关系组成。下面我们来看看设置其中的每一种模式时会发生什么情况。

XmlReadMode.IgnoreSchema 选项将使该方法忽略任何嵌入式架构或援用的架构。因此,该数据被加载到现有的数据集架构,而不适合的任何数据将被放