從 XML 載入 DataSet

可以從 XML 資料流或文件建立 ADO.NET DataSet 的內容。此外,使用 .NET Framework,可讓您在決定從 XML 載入何種資訊,以及如何建立 DataSet 的結構描述或關聯式結構時,擁有相當大的彈性。

若要使用來自 XML 的資料填入 DataSet,請使用 DataSet 物件的 ReadXml 方法。ReadXml 方法會從檔案、資料流或 XmlReader 進行讀取,並將 XML 來源當成引數,加上選擇性的 XmlReadMode 引數 (如需 XmlReader 的詳細資訊,請參閱使用 XmlTextReader 讀取 XML 資料)。ReadXml 方法讀取 XML 資料流或文件的內容,並載入具有資料的 DataSet。它也根據指定的 XmlReadMode 以及是否已經有關聯式結構描述,來建立 DataSet 的關聯式結構描述。

下列表格描述 XmlReadMode 引數的選項。

選項 說明

Auto

此為預設值。檢查 XML 並依下列順序選擇最適當的選項:

  • 如果 XML 為 DiffGram,則使用 DiffGram

  • 如果 DataSet 包含結構描述或 XML 包含內嵌結構描述,則使用 ReadSchema

  • 如果 DataSet 不包含結構描述,且 XML 不包含內嵌結構描述,則使用 InferSchema

如果您知道要讀取的 XML 格式,則為了達到最佳效能,建議您設定外顯的 XmlReadMode,而不是接受 Auto 預設值。

ReadSchema

讀取任何內嵌結構描述,並載入資料和結構描述。

如果 DataSet 已經包含結構描述,則會將新資料表從內嵌結構描述加入 DataSet 的現有結構描述中。如果內嵌結構描述中的任何資料表已經存在於 DataSet 中,則會擲回例外狀況。您將無法使用 XmlReadMode.ReadSchema 修改現有資料表的結構描述。

如果 DataSet 不包含結構描述,且沒有內嵌結構描述,則不會讀取任何資料。

內嵌結構描述可使用 XML 結構描述定義語言 (XSD) 的結構描述來定義。如需將內嵌結構描述撰寫為 XML 結構描述的詳細資訊,請參閱從 XML 結構描述 (XSD) 產生 DataSet 關聯式結構

IgnoreSchema

忽略任何內嵌結構描述,並將資料載入現有的 DataSet 結構描述中。任何與現有結構描述不相符的資料會被捨棄。如果 DataSet 中沒有結構描述,則不會載入任何資料。

如果資料是 DiffGram,IgnoreSchema 會具有和 DiffGram 相同的功能。

InferSchema

忽略任何內嵌結構描述,並推斷每個 XML 資料結構的結構描述,然後載入資料。

如果 DataSet 已經包含結構描述,則可以在目前沒有資料表的地方加入新的資料表,或將資料行加入現有資料表,來擴充目前的結構描述。如果推斷資料表已經存在但使用不同的命名空間,或者任何推斷的資料行與現有資料行衝突,便會擲回例外狀況。

如需 ReadXmlSchema 如何從 XML 文件推斷結構描述的詳細資訊,請參閱從 XML 推斷 DataSet 關聯式結構

DiffGram

讀取 DiffGram 並將資料加入目前的結構描述。DiffGram 將新資料列與唯一識別項值相符的現有資料列合併。請參閱這個主題結尾處<從 XML 合併資料>。如需 DiffGram 的詳細資訊,請參閱 DiffGram

Fragment

繼續讀取多個 XML 片段,直到到達資料流末。與 DataSet 結構描述相符的片段會附加至適當的資料表。與 DataSet 結構描述不相符的片段則會予以捨棄。

Note注意事項

如果您將 XmlReader 傳遞給位於 XML 文件內的 ReadXml,則 ReadXml 會讀到下一個項目節點並將它視為根項目,並只讀至該項目節點的結尾。如果您指定 XmlReadMode.Fragment 則不會發生這種情況。

DTD 實體

如果您的 XML 包含文件類型定義 (DTD) 結構描述中所定義的實體,而您嘗試將檔案名稱、資料流或非驗證的 XmlReader 傳遞給 ReadXml 以載入 DataSet,則會擲回例外狀況。因此,您必須建立 XmlValidatingReader,其中 EntityHandling 設定為 EntityHandling.ExpandEntities,並將您的 XmlValidatingReader 傳遞給 ReadXmlXmlValidatingReader 會在由 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);
Note注意事項

如果要呼叫 ReadXml 來載入一個非常大的檔案,將會使效能降低。為了確保 ReadXml 在針對大檔案時仍能保持最佳效能,請針對 DataSet 的每個資料表都呼叫 BeginLoadData 方法,再呼叫 ReadXml。最後再針對 DataSet 的每個資料表呼叫 EndLoadData (如下列範例所示)。

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();
Note注意事項

如果 DataSet 的 XSD 結構描述包括 targetNamespace,則不會讀取資料,而且在呼叫 ReadXml 以載入具有 XML (其內含非限定命名空間的項目) 的 DataSet 時,也會遇到例外狀況。若要在此例中讀取不合格的項目,請在 XSD 結構描述中,將 elementFormDefault 設定等於 "qualified"。例如:

<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,然後將新 DataSet 合併至現有的 DataSet。請注意,使用 XmlReadModeDiffGramReadXML 載入 DiffGram 時,將會合併具有相同唯一識別項的資料列。

請參閱

參考

DataSet.Merge Method

概念

DiffGram
從 XML 載入 DataSet 結構描述資訊

其他資源

在 DataSet 中使用 XML
從 XML 結構描述 (XSD) 產生 DataSet 關聯式結構
從 XML 推斷 DataSet 關聯式結構
使用 ADO.NET 中的 DataSets