返回首页
当前位置: 主页 > 网络编程 > .Net实例教程 >

ADO.NET 中的 XML 特性概述

时间:2013-07-16 23:10来源:知行网www.zhixing123.cn 编辑:麦田守望者

 毫无疑问,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.Autosr.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 选项将使该方法忽略任何嵌入式架构或引用的架构。因此,该数据被加载到现有的数据集架构,而不适合的任何数据将被放弃。如果数据集中不存在架构,则不加载任何数据。注意,空的数据集没有架构信息。记住,如果 XML 源是 DiffGram 格式的,则 IgnoreSchema 选项的效果与 XmlReadMode.DiffGram 一样。

  // no schema in the DataSet, no data will be loadedDataSet ds = new DataSet();StreamReader sr = new StreamReader(fileName);ds.ReadXml(sr, XmlReadMode.IgnoreSchema);


XmlReadMode.ReadSchema 选项只对嵌入式架构有效,而不识别外部引用。它可以向数据集添加新表,但如果数据集中已存在在嵌入式架构中定义的任何表,则将引发异常。您不能使用 ReadSchema 选项来更改一个现有表的架构。如果数据集不包含架构(也就是说,数据集是空的),并且没有嵌入式架构,则不读取和加载任何数据。ReadXml 只能读取使用 XML 架构定义语言 (XSD) 或 XML-Data Reduced (XDR) 定义的嵌入式架构。不支持任何文档类型定义 (DTD)。

  如果设置了 XmlReadMode.InferSchema 选项,ReadXml 将直接从 XML 数据的结构推断架构,并忽略可能存在的任何嵌入式架构。只有在推断出架构后,才加载数据。通过根据情况来添加新表或向现有的表添加新列可扩展现有的架构。您可以使用数据集的 InferXmlSchema 方法将架构从指定的 XML 文件加载到数据集。在某种程度上,您可以控制在架构推断操作过程中处理的 XML 元素。利用方法 InferXmlSchema 的签名,您可以指定一组其元素将从推断中排除的命名空间。

  void InferXmlSchema(String fileName, String[] rgNamespace);

  DiffGram 是 ADO.NET 用于保存数据集状态的 XML 格式。与 SQLXML 的 updategram 格式类似的是,DiffGram 同时包括数据行的当前状态和原始状态。使用 ReadXml 加载 DiffGram 时,将合并具有相匹配的主键的行。您可以使用 XmlReadMode.DiffGram 标志显式指示 ReadXml 对 DiffGram 生效。使用 DiffGram 格式时,目标数据集必须具有与 DiffGram 相同的架构,否则,合并操作将失败,并会引发异常。

  如果设置了 XmlReadMode.Fragment 选项,将从 XML 片段加载数据集。XML 片段是一段有效的 XML,它标识元素、属性和文档。元素的 XML 片段是完全限定 XML 元素(节点、CDATA、处理指令、注释)的标记文本。属性的片段是属性值,文档的片段则是整个内容集合。如果 XML 数据是一个片段,则不应用完整格式的 XML 文档的根级别规则。与现有的架构相匹配的片段被追加到适当的表,不匹配架构的片段将被放弃。ReadXml 从当前位置读到流的结尾。XmlReadMode.Fragment 选项不应该用于填充一个空的而且缺少架构的数据集。

  将数据集对象序列化到 XML

  数据集的 XML 表示形式可以使用 WriteXml 方法写入文件、流、XmlWriter 对象或字符串。XML 表示形式可以包括架构信息,也可以不包括架构信息。WriteXml 方法的实际行为可通过您可以传递的 XmlWriteMode 参数来控制。XmlWriteMode 枚举中的值决定着输出的布局。数据集表示形式包括表、关系和约束定义。如果您不选择使用 DiffGram 格式,数据集的表中的行就只写入其当前版本。下表概括了 XmlWriteMode 可以使用的写选项。

  IgnoreSchema将数据集内容作为没有架构的 XML 数据写入

  WriteSchema写入具有嵌入式 XSD 架构的数据集内容

  DiffGram将数据集内容作为 DiffGram 写入,包括原始值和当前值

  XmlWriteMode.IgnoreSchema 是默认选项。下面的代码显示了将数据集序列化为 XML 的典型方式。

  // ds is the DataSetStreamWriter sw = new StreamWriter(fileName);ds.WriteXml(sw); // defaults to XmlWriteMode.IgnoreSchemasw.Close();

  有几个因素影响了从 DataSet 对象创建的 XML 文档的最终结构。这些因素包括:

  ?使用的 XML 整体格式 — DiffGram 或当前内容的无格式分层表示形式

  ?架构信息是否存在

  ?嵌套关系

  ?表列如何映射到 XML 元素

  DiffGram 格式是本人稍后将进一步说明的特殊 XML 格式。它不包括架构信息,但保留行状态和行错误。因而,它似乎能构成数据集实时实例的更接近的表示形式。

------分隔线----------------------------
标签(Tag):C# C#实例教程 c#基础教程 C#源代码 c#技巧
------分隔线----------------------------
推荐内容
猜你感兴趣