可以通过编程方式定义DataSet的架构(其表、列、关系和约束),也可以由 DataAdapter 的Fill或FillSchema方法创建,或从 XML 文档加载。 若要从 XML 文档加载DataSet架构信息,可以使用ReadXmlSchema方法或InferXmlSchemaDataSet的方法。
ReadXmlSchema 允许从包含 XML 架构定义语言 (XSD) 架构的文档或包含内联 XML 架构的 XML 文档加载或推断 DataSet 架构信息。
InferXmlSchema 允许从 XML 文档推断架构,同时忽略指定的某些 XML 命名空间。
注释
使用 Web 服务或 XML 序列化传输DataSet通过使用 XSD 构造(如嵌套关系)在内存中创建的表排序时,可能不会保留表排序DataSet。 因此,接收者 DataSet 不应依赖于本例中的表格排序。 只要传输的DataSet架构是从XSD文件中读取的,而不是在内存中创建的,表排序就始终会被保留。
ReadXmlSchema
若要从 XML 文档加载架构DataSet而不加载任何数据,可以使用ReadXmlSchema数据集的方法。
ReadXmlSchema 创建使用 XML Schema 定义语言 (XSD) 定义的 DataSet 架构。
方法 ReadXmlSchema 接受一个包含要加载的 XML 文档的文件名、流或 XmlReader 的单个参数。 XML 文档只能包含架构,也可以包含包含数据的 XML 元素的内联架构。 有关将内联架构编写为 XML 架构的详细信息,请参阅从 XML 架构派生数据集关系结构(XSD)。
如果传递给 ReadXmlSchema 的 XML 文档不包含内联架构信息, ReadXmlSchema 将从 XML 文档中的元素推断架构。
DataSet如果已包含架构,则如果当前架构尚不存在,则通过添加新表来扩展当前架构。 不会将新列添加到现有表。 如果添加的列已存在于 DataSet XML 中找到的列中,但该列的类型与在 XML 中找到的列不兼容,则会引发异常。 有关如何从 XML 文档推断架构的详细信息 ReadXmlSchema ,请参阅 从 XML 推断数据集关系结构。
尽管 ReadXmlSchema 只加载或推断 数据集的架构,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使用InferXmlSchema数据集的方法从 XML 文档中推断其架构。
InferXmlSchema 函数的功能与同时使用 ReadXml 和 XmlReadModeInferSchema 的函数相同(既加载数据又推断模式),如果正在读取的文档不包含内联模式,则与 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该方法和ReadXml方法XmlReadModeInferSchema都会为文档中每个元素创建表:Categories、CategoryID、CategoryName、Description、Products、ProductID、ReorderLevel 和 Discontinued。 (有关详细信息,请参阅从 XML 推断数据集关系结构。)但是,更合适的结构是只创建Categories和Products表,然后在Categories表中创建CategoryID、CategoryName、Description列,以及在Products表中创建ProductID、ReorderLevel、Discontinued列。 若要确保推断的架构忽略 XML 元素中指定的属性,请使用 InferXmlSchema 该方法并指定要忽略的 XML 命名空间 officedata ,如以下示例所示。
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");