可以從 XML 資料流或文件建立 ADO.NET DataSet 的內容。 此外,使用 .NET Framework 可讓您在決定從 XML 載入何種資訊,以及如何建立 DataSet 的結構描述或關聯式結構時,擁有相當大的彈性。
要用 XML 資料填入 a DataSet ,請使用 ReadXml 物件的方法 DataSet 。 此 ReadXml 方法可從檔案、串流或 XmlReader 讀取,並以 XML 的原始碼及一個可選 XmlReadMode 參數作為參數。 如需 XmlReader 的詳細資訊,請參閱使用 XmlTextReader 讀取 XML 資料。
ReadXml 方法讀取 XML 串流或 XML 文件的內容,並將資料載入 DataSet。 它也會根據XmlReadMode指定的條件以及是否已經存在關聯結構來建立DataSet的關聯結構。
下表說明了該 XmlReadMode 論證的選項。
| 選項 | 描述 |
|---|---|
| 自動 | 這是預設值。 檢查 XML 並依下列順序選擇最適當的選項: - 若 XML 為 DiffGram 時,會使用 DiffGram。- 若 包含 DataSet 結構或 XML 包含內嵌結構, ReadSchema 則使用- 若DataSet不包含結構描述,且XML中不包含內嵌結構描述,則使用 InferSchema。如果你知道被讀取的 XML 格式,為了最佳效能,建議你設定明確的 XmlReadMode,而不是接受預設值 Auto 。 |
| ReadSchema | 讀取任何內嵌結構描述,並載入資料和結構描述。 如果 DataSet 已經包含結構描述,則會將新資料表從內嵌結構描述加入 DataSet 的現有結構描述中。 如果內嵌結構描述中的任何資料表已經存在於 DataSet 中,則會擲回例外狀況。 您將無法使用 XmlReadMode.ReadSchema 修改現有資料表的結構描述。 如果 DataSet 不包含結構描述,且沒有內嵌結構描述,則不會讀取任何資料。 內嵌結構描述可使用 XML 結構描述定義語言 (XSD) 的結構描述來定義。 如需將內置結構描述寫入為 XML 結構描述的詳細資料,請參閱從 XML 結構描述衍生 DataSet 關聯式結構 (XSD)。 |
| IgnoreSchema | 忽略任何內嵌結構描述,並將資料載入現有的 DataSet 結構描述中。 任何與現有結構描述不相符的資料會被捨棄。 如果 DataSet 中沒有結構描述,則不會載入任何資料。 如果資料是 DiffGram,則 IgnoreSchema 具有與 DiffGram相同的功能。 |
| InferSchema推斷資料架構 | 忽略任何內嵌結構描述,並推斷每個 XML 資料結構的結構描述,然後載入資料。 如果 DataSet 已經包含結構描述,則會將資料行加入現有的資料表來擴充目前的結構描述。 如果沒有現有的資料表,則不會加入額外的資料表。 如果推斷資料表已經存在但使用不同的命名空間,或者任何推斷的資料行與現有資料行衝突,便會擲回例外狀況。 關於如何 ReadXmlSchema 從 XML 文件推導結構的詳細資訊,請參見 《從 XML 推斷資料集關聯結構》。 |
| DiffGram | 讀取 DiffGram 並將資料加入目前的結構描述。
DiffGram 將新列與唯一識別碼相符的現有列合併。 請參閱這個主題結尾處<從 XML 合併資料>。 如需 DiffGrams 的詳細資訊,請參閱 DiffGrams。 |
| 片段 | 繼續讀取多個 XML 片段,直到到達資料流末。 與 DataSet 結構描述相符的片段會附加至適當的資料表。 與 DataSet 結構描述不相符的片段則會捨棄。 |
注意
如果你傳送 XmlReader 到 ReadXml,且 ReadXml 的位置在 XML 文件的中部,ReadXml 將會讀取到下一個元素節點,並將其視為根元素,僅讀取到該元素節點的結尾。 如果您指定 XmlReadMode.Fragment 則不會發生這種情況。
DTD 實體
如果你的 XML 包含文件類型定義(DTD)結構中定義的實體,當你嘗試透過傳遞檔名、串流或非驗證DataSet方式給 XmlReader 來載入 a 時,會拋出例外。 相反地,你必須建立一個 XmlValidatingReader,設定 EntityHandling 為 EntityHandling.ExpandEntities,並將你的資料 XmlValidatingReader 傳給 ReadXml。 在XmlValidatingReader讀取之前,實體會被DataSet展開。
下列程式碼範例顯示如何從 XML 資料流載入 DataSet。 第一個範例顯示檔案名稱被傳遞給方法 ReadXml 。 第二個範例顯示內含使用 StringReader 所載入之 XML 的字串。
Dim dataSet As DataSet = New DataSet
dataSet.ReadXml("input.xml", XmlReadMode.ReadSchema)
DataSet dataSet = new DataSet();
dataSet.ReadXml("input.xml", XmlReadMode.ReadSchema);
Dim dataSet As DataSet = New DataSet
Dim dataTable As DataTable = New DataTable("table1")
dataTable.Columns.Add("col1", Type.GetType("System.String"))
dataSet.Tables.Add(dataTable)
Dim xmlData As String = "<XmlDS><table1><col1>Value1</col1></table1><table1><col1>Value2</col1></table1></XmlDS>"
Dim xmlSR As System.IO.StringReader = New System.IO.StringReader(xmlData)
dataSet.ReadXml(xmlSR, XmlReadMode.IgnoreSchema)
DataSet dataSet = new DataSet();
DataTable dataTable = new DataTable("table1");
dataTable.Columns.Add("col1", typeof(string));
dataSet.Tables.Add(dataTable);
string xmlData = "<XmlDS><table1><col1>Value1</col1></table1><table1><col1>Value2</col1></table1></XmlDS>";
System.IO.StringReader xmlSR = new System.IO.StringReader(xmlData);
dataSet.ReadXml(xmlSR, XmlReadMode.IgnoreSchema);
注意
如果你呼叫 ReadXml 載入一個非常大的檔案,可能會遇到效能變慢的問題。 為了確保 ReadXml 的最佳效能,請在大型檔案上對 BeginLoadData 的每個資料表呼叫 DataSet 方法,再呼叫 ReadXml。 最後再針對 EndLoadData 的每個資料表呼叫 DataSet (如下列範例所示)。
Dim dataTable As DataTable
For Each dataTable In dataSet.Tables
dataTable.BeginLoadData()
Next
dataSet.ReadXml("file.xml")
For Each dataTable in dataSet.Tables
dataTable.EndLoadData()
Next
foreach (DataTable dataTable in dataSet.Tables)
dataTable.BeginLoadData();
dataSet.ReadXml("file.xml");
foreach (DataTable dataTable in dataSet.Tables)
dataTable.EndLoadData();
注意
如果你的 DataSet XSD 架構包含 目標命名空間,資料可能無法讀取,且當你呼叫 ReadXml 載入 DataSet 包含無限定命名空間元素的 XML 時,可能會遇到異常。 在這種情況下,要讀取不合格的元素,請將你的 XSD 架構中的elementFormDefault設定為「合格」。 例如:
<xsd:schema id="customDataSet"
elementFormDefault="qualified"
targetNamespace="http://www.tempuri.org/customDataSet.xsd"
xmlns="http://www.tempuri.org/customDataSet.xsd"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
</xsd:schema>
從 XML 合併資料
如果 DataSet 已經包含資料,則會將 XML 的新資料加入 DataSet 中已出現的資料中。
ReadXml 不會將具有相符主鍵的任何列資訊從 XML 合併到 DataSet。 若要用 XML 的新資訊覆蓋現有的列資訊,請使用 ReadXml 來建立新的 DataSet,然後 Merge 將新的 DataSet 置於現有 DataSet的 。 請注意,使用 ReadXML 與 XmlReadMode 的 DiffGram 載入 DiffGram,將合併具有相同唯一識別碼的列。