DataSet 的結構(其表格、欄位、關係及約束)可以透過程式化定義,由 DataAdapter 的 Fill 或 FillSchema 方法建立,或從 XML 文件載入。 要從 XML 文件載入DataSet結構資訊,你可以使用 ReadXmlSchemaInferXmlSchema 的方法。
ReadXmlSchema 允許你從包含 XML Schema 定義語言(XSD)架構的文件,或包含內嵌 XML 架構的 XML 文件中載入或推斷 DataSet 結構資訊。
InferXmlSchema 允許你從 XML 文件推斷結構,同時忽略你指定的某些 XML 命名空間。
備註
當你使用 Web 服務或 XML 序列化來傳輸在記憶體中透過 XSD 結構(如巢狀關係)建立的DataSet時,DataSet的排序可能無法被保留。 因此,DataSet 的接收者在這種情況下不應依賴於表格的排序順序。 然而,如果傳輸的結構 DataSet 是從 XSD 檔案讀取,而非在記憶體中建立,資料表排序則會被保留。
ReadXmlSchema
若要從 XML 文件載入 a DataSet 的結構,且不載入任何資料,可以使用 ReadXmlSchemaDataSet 的方法。
ReadXmlSchema 創建使用 XML 結構定義語言(XSD)架構來定義 DataSet 的結構。
此 ReadXmlSchema 方法會接收一個引數,可以是檔案名稱、串流,或是 XmlReader,其中包含要載入的 XML 文件。 XML 檔案只能包含架構,也可以包含包含資料的 XML 元素內嵌架構。 如需將內置結構描述寫入為 XML 結構描述的詳細資料,請參閱從 XML 結構描述衍生 DataSet 關聯式結構 (XSD)。
若傳遞給 ReadXmlSchema 的 XML 文件不含內嵌結構資訊, ReadXmlSchema 則會從 XML 文件中的元素推導出該結構。 如果 DataSet 已經包含一個 schema,當前的 schema 將會透過新增尚不存在的資料表來進行擴充。 新的欄位將不會加入至現有的數據表。 如果新增欄位中已存在 DataSet ,但其型別與 XML 中的欄位不相容,則會拋出例外。 關於如何 ReadXmlSchema 從 XML 文件推導結構的詳細資訊,請參見 《從 XML 推斷資料集關聯結構》。
雖然 ReadXmlSchema 僅載入或推斷 DataSet 的結構,但 DataSet 的 ReadXml 方法會同時載入或推斷 XML 文件中的結構和資料。 如需詳細資訊,請參閱 從 XML 載入數據集。
以下程式碼範例說明如何從 XML 文件或串流載入 DataSet 結構。 第一個範例展示 XML Schema 檔案名稱如何被傳遞給 ReadXmlSchema 方法。 第二個範例顯示 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 相同,即能載入資料並推斷結構,特別是在讀取的文件中沒有內嵌結構時也是如此。 不過,它 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建立 and Products 表格,然後在表格中建立 CategoryID、CategoryName 和Description欄位Categories,以及表格中的 ProductID、Discontinued 和Products欄位。 為確保推論出的結構忽略 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");