Bagikan melalui


Memuat Himpunan Data dari XML

Konten ADO.NET DataSet dapat dibuat dari aliran XML atau dokumen. Selain itu, dengan .NET Framework Anda memiliki fleksibilitas tinggi atas informasi apa yang dimuat dari XML, dan bagaimana skema atau struktur relasional DataSet dibuat.

Untuk mengisi DataSet dengan data dari XML, gunakan metode ReadXml objek DataSet. Metode ReadXml membaca dari file, aliran, atau XmlReader, dan menggunakan argumen sebagai sumber XML ditambah argumen opsional XmlReadMode. Untuk informasi selengkapnya tentang XmlReader, lihat Membaca Data XML dengan XmlTextReader. Metode ReadXml membaca konten aliran XML atau dokumen dan memuat DataSet dengan data. Ini juga akan membuat skema relasional DataSet bergantung pada XmlReadMode yang ditentukan dan apakah skema relasional sudah ada atau belum.

Tabel berikut menjelaskan opsi untuk argumen XmlReadMode.

Opsi Deskripsi
Auto Ini adalah default. Memeriksa XML dan memilih opsi yang paling sesuai dalam urutan berikut:

- Jika XML adalah DiffGram, DiffGram digunakan.
- Jika DataSet berisi skema atau XML berisi skema sebaris, ReadSchema digunakan.
- Jika DataSet tidak berisi skema dan XML tidak berisi skema sebaris, InferSchema digunakan.

Jika Anda mengetahui format XML yang sedang dibaca, untuk mendapatkan performa terbaik, sebaiknya Anda mengatur XmlReadMode eksplisit, daripada menerima default Otomatis.
ReadSchema Membaca skema sebaris dan memuat data dan skema.

Jika DataSet sudah berisi skema, tabel baru ditambahkan dari skema sebaris ke skema yang ada di DataSet. Jika ada tabel dalam skema sebaris yang sudah ada di DataSet, pengecualian akan ditampilkan. Anda tidak akan dapat mengubah skema tabel yang ada menggunakan XmlReadMode.ReadSchema.

Jika DataSet tidak berisi skema, dan tidak ada skema sebaris, tidak ada data yang dibaca.

Skema sebaris dapat didefinisikan menggunakan skema bahasa definisi Skema XML (XSD). Untuk detail tentang menulis skema sebaris sebagai Skema XML, lihat Mendapatkan Struktur Relasional DataSet dari Skema XML (XSD).
IgnoreSchema Mengabaikan skema sebaris apa pun dan memuat data ke dalam skema DataSet yang ada. Data apa pun yang tidak cocok dengan skema yang ada akan dibuang. Jika tidak ada skema di DataSet, tidak ada data yang dimuat.

Jika datanya adalah DiffGram, IgnoreSchema memiliki fungsi yang sama seperti DiffGram.
InferSchema Mengabaikan skema sebaris dan menyimpulkan skema per struktur data XML, lalu memuat data.

Jika DataSet sudah berisi skema, skema saat ini diperluas dengan menambahkan kolom ke tabel yang ada. Tabel tambahan tidak akan ditambahkan jika belum ada tabel. Pengecualian ditampilkan jika tabel yang disimpulkan sudah ada dengan namespace yang berbeda, atau jika ada kolom yang disimpulkan bertentangan dengan kolom yang ada.

Untuk detail tentang bagaimana ReadXmlSchema menyimpulkan skema dari dokumen XML, lihat Menyimpulkan Struktur Relasional DataSet dari XML.
DiffGram Membaca DiffGram dan menambahkan data ke skema saat ini. DiffGram menggabungkan baris baru dengan baris yang ada di mana nilai pengidentifikasi unik cocok. Lihat "Menggabungkan Data dari XML" di akhir topik ini. Untuk informasi selengkapnya tentang DiffGrams, lihat DiffGrams.
Fragmen Terus membaca beberapa fragmen XML hingga akhir aliran tercapai. Fragmen yang cocok dengan skema DataSet ditambahkan ke tabel yang sesuai. Fragmen yang tidak cocok dengan skema DataSet akan dibuang.

Catatan

Jika Anda meneruskan XmlReader ke ReadXml yang diposisikan sebagian ke dalam dokumen XML, ReadXml akan membaca ke node elemen berikutnya dan akan memperlakukannya sebagai elemen root, membaca sampai akhir node elemen saja. Ini tidak berlaku jika Anda menentukan XmlReadMode.Fragment.

Entitas DTD

Jika XML Anda berisi entitas yang ditentukan dalam skema definisi jenis dokumen (DTD), pengecualian akan muncul jika Anda mencoba memuat DataSet dengan meneruskan nama file, aliran, atau XmlReader non-validasi ke BacaXml. Sebagai gantinya, Anda harus membuat XmlValidatingReader, dengan EntityHandling diatur ke EntityHandling.ExpandEntities, dan meneruskan XmlValidatingReader Anda ke ReadXml. XmlValidatingReader akan memperluas entitas sebelum dibaca oleh DataSet.

Contoh kode berikut menunjukkan cara memuat DataSet dari aliran XML. Contoh pertama menunjukkan nama file yang diteruskan ke metode ReadXml. Contoh kedua menunjukkan string yang berisi XML sedang dimuat menggunakan StringReader.

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);  

Catatan

Jika Anda memanggil ReadXml untuk memuat file yang sangat besar, Anda mungkin mengalami performa yang lambat. Untuk memastikan performa terbaik untuk ReadXml, pada file besar, panggil metode BeginLoadData untuk setiap tabel di DataSet, lalu panggil ReadXml. Terakhir, panggil EndLoadData untuk setiap tabel di DataSet, seperti yang ditunjukkan pada contoh berikut.

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();  

Catatan

Jika skema XSD untuk DataSet Anda menyertakan targetNamespace, data mungkin tidak terbaca, dan Anda mungkin menemukan pengecualian, saat memanggil ReadXml untuk memuat DataSet dengan XML yang berisi elemen tanpa namespace yang memenuhi syarat. Untuk membaca elemen yang tidak memenuhi syarat dalam kasus ini, atur elementFormDefault sama dengan "memenuhi syarat" dalam skema XSD Anda. Misalnya:

<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>  

Menggabungkan Data dari XML

Jika DataSet sudah berisi data, data baru dari XML ditambahkan ke data yang sudah ada di DataSet. ReadXml tidak bergabung dari XML ke dalam DataSet informasi baris mana pun dengan kunci utama yang cocok. Untuk menimpa informasi baris yang ada dengan informasi baru dari XML, gunakan ReadXml untuk membuat DataSet baru, lalu MergeDataSet baru ke DataSet yang ada. Perhatikan bahwa memuat DiffGram menggunakan ReadXML dengan XmlReadMode dari DiffGram akan menggabungkan baris yang memiliki pengidentifikasi unik yang sama.

Lihat juga