从 XML 加载数据集架构信息

DataSet 的架构(它的表、列、关系和约束)可以通过编程来定义,使用 DataAdapter 的 Fill 或 FillSchema 方法来创建,或从 XML 文档中加载。 若要从 XML 文档中加载 DataSet 架构信息,可以使用 DataSet 的 ReadXmlSchema 或 InferXmlSchema 方法。 ReadXmlSchema 用于从包含 XML 架构定义语言 (XSD) 架构的文档或包含内联 XML 架构的 XML 文档加载或推断 DataSet 架构信息。 InferXmlSchema 用于在从 XML 文档推断架构时忽略所指定的特定 XML 命名空间。

备注

使用 Web 服务或 XML 序列化传输采用 XSD 构造(如嵌套关系)在内存中创建的 DataSet 时,可能不会保留 DataSet 中的表顺序。 因此,在这种情况下,DataSet 的接收人不应依赖表顺序。 但是,如果要传输的 DataSet 的架构是从 XSD 文件读取的,而不是在内存中创建的,则会始终保留表顺序。

ReadXmlSchema

若要从 XML 文档中加载 DataSet 的架构而不加载任何数据,可以使用 DataSet 的 ReadXmlSchema 方法。 ReadXmlSchema 创建使用 XML 架构定义语言 (XSD) 架构定义的 DataSet 架构。

ReadXmlSchema 方法接受单个自变量,如文件名、流或包含要加载的 XML 文档的 XmlReader。 XML 文档可以仅包含架构,也可以包含与包含数据的 XML 元素内联的架构。 有关将内联架构作为 XML 架构写入的详细信息,请参阅从 Xml 架构派生数据集关系结构 (XSD)

如果传递给 ReadXmlSchema 的 XML 文档不包含内联架构信息,则 ReadXmlSchema 将根据 XML 文档中的元素推断该架构。 如果 DataSet 已包含架构,则会在表不存在的情况下通过添加新表来扩展当前架构。 不会将新列添加到现有表中。 如果所添加的列已存在于 DataSet 中但该列的类型与 XML 中的相应列不兼容,则将引发异常。 有关 ReadXmlSchema 如何从 xml 文档推断架构的详细信息,请参阅从 Xml 推断数据集关系结构

尽管 ReadXmlSchema 仅加载或推断 DataSet 的架构,但是 DataSet 的 ReadXml 方法则将加载或推断 XML 文档中包含的架构和数据。 有关详细信息,请参阅 从 XML 加载数据集

以下代码示例显示如何从 XML 文档或流中加载 DataSet 架构。 第一个示例显示向 ReadXmlSchema 方法传递的 XML 架构文件名。 第二个示例显示一个 System.IO.StreamReader。

Dim dataSet As DataSet = New DataSet  
dataSet.ReadXmlSchema("schema.xsd")  
DataSet dataSet = new DataSet();  
dataSet.ReadXmlSchema("schema.xsd");  
Dim xmlStream As New System.IO.StreamReader("schema.xsd")
Dim dataSet As DataSet = New DataSet  
dataSet.ReadXmlSchema(xmlStream)  
xmlStream.Close()  
System.IO.StreamReader xmlStream = new System.IO.StreamReader("schema.xsd");  
DataSet dataSet = new DataSet();  
dataSet.ReadXmlSchema(xmlStream);  
xmlStream.Close();  

InferXmlSchema

也可以指示 DataSet 使用 DataSet 的 InferXmlSchema 方法来从 XML 文档推断其架构。 InferXmlSchema 的功能与 XmlReadMode 为 InferSchema 的 ReadXml(加载数据并推断架构)以及所读取的文档不包含任何内联架构时的 ReadXmlSchema 相同。 但是,InferXmlSchema 还提供了其他功能,使您能够指定在推断架构时所忽略的特定 XML 命名空间。 InferXmlSchema 采用两个必需的参数:XML 文档的位置,由文件名、流或 XmlReader 指定;以及要在该操作中忽略的 XML 命名空间的字符串数组。

例如,考虑以下 XML:

<NewDataSet xmlns:od="urn:schemas-microsoft-com:officedata">  
<Categories>  
  <CategoryID od:adotype="3">1</CategoryID>
  <CategoryName od:maxLength="15" od:adotype="130">Beverages</CategoryName>
  <Description od:adotype="203">Soft drinks and teas</Description>
</Categories>  
<Products>  
  <ProductID od:adotype="20">1</ProductID>
  <ReorderLevel od:adotype="3">10</ReorderLevel>
  <Discontinued od:adotype="11">0</Discontinued>
</Products>  
</NewDataSet>  

考虑到为上述 XML 文档中元素指定的属性,具有 InferSchema 的 XmlReadMode 的 ReadXmlSchema 方法和 ReadXml 方法将为该文档中的每个元素创建表:Categories、CategoryID、CategoryName、Description、Products、ProductID、ReorderLevel 和 Discontinued。 (有关详细信息,请参阅从 XML.推断数据集关系结构。)但是,更为合适的结构是仅创建 Categories 和 Products 表,然后在 Categories 表中创建 CategoryID、CategoryName 和 Description 列,并在 Products 表中创建 ProductID、ReorderLevel 和 Discontinued 列。 若要确保推断架构忽略在 XML 元素中指定的属性,请使用 InferXmlSchema 方法,并为要忽略的 officedata 指定 XML 命名空间(如下例所示)。

Dim dataSet As DataSet = New DataSet  
dataSet.InferXmlSchema("input_od.xml", New String() {"urn:schemas-microsoft-com:officedata"})  
DataSet dataSet = new DataSet();  
dataSet.InferXmlSchema("input_od.xml", new string[] "urn:schemas-microsoft-com:officedata");  

请参阅