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

ReadXmlSchema

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

ReadXmlSchema 方法采用单个参数,如文件名、流或包含要加载的 XML 文档的 XmlReader。该 XML 文档可以仅包含架构,也可以包含与包含数据的 XML 元素内联的架构。有关以 XML 架构形式编写内联架构的详细信息,请参阅从 XML 架构 (XSD) 生成 DataSet 关系结构

如果向 ReadXmlSchema 传递的 XML 文档不包含内联架构信息,ReadXmlSchema 将从 XML 文档中的元素推断架构。如果 DataSet 已经包含架构,当前架构将通过向现有表添加新列和添加新表(如果它们尚不存在)来进行扩展。如果所添加的列已存在于 DataSet 中但该列的类型与 XML 中的相应列不兼容,则将引发异常。有关 ReadXmlSchema 如何从 XML 文档推断架构的详细信息,请参阅从 XML 推断 DataSet 关系结构

ReadXmlSchema 仅加载或推断 DataSet 的架构,而DataSetReadXml 方法则将加载或推断 XML 文档中包含的架构和数据。有关更多信息,请参阅从 XML 中加载 DataSet

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

Dim myDS As DataSet = New DataSet
myDS.ReadXmlSchema("schema.xsd")

DataSet myDS = new DataSet();
myDS.ReadXmlSchema("schema.xsd");

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

System.IO.StreamReader xmlStream = new System.IO.StreamReader("schema.xsd");
DataSet myDS = new DataSet();
myDS.ReadXmlSchema(xmlStream);
xmlStream.Close();

InferXmlSchema

您也可以指示 DataSet 使用 DataSet InferXmlSchema 方法来从 XML 文档推断其架构。InferXmlSchema 的功能与 XmlReadModeInferSchemaReadXml(加载数据和推断架构)以及 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 文档中的元素指定的属性,ReadXmlSchema 方法以及 XmlReadModeInferSchemaReadXml 方法都会为文档中的每个元素创建表:CategoriesCategoryIDCategoryNameDescriptionProductsProductIDReorderLevelDiscontinued。(有关更多信息,请参阅从 XML 推断 DataSet 关系结构。)但是,更为合适的结构是仅创建 CategoriesProducts 表,然后在 Categories 表中创建 CategoryIDCategoryNameDescription 列,并在 Products 表中创建 ProductIDReorderLevelDiscontinued 列。若要确保推断架构忽略在 XML 元素中指定的属性,请使用 InferXmlSchema 方法,并指定使 officedata 被忽略的 XML 命名空间(如下例所示)。

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

DataSet myDS = new DataSet();
myDS.InferXmlSchema("input_od.xml", new string[] "urn:schemas-microsoft-com:officedata");