Share via


XML’den DataSet Yükleme

ADO.NET DataSet içeriği bir XML akışından veya belgeden oluşturulabilir. Buna ek olarak, .NET Framework ile XML'den hangi bilgilerin yüklendiği ve şemasının veya ilişkisel yapısının DataSet nasıl oluşturulduğu konusunda büyük bir esnekliğe sahip olursunuz.

XML'den DataSet alınan verilerle doldurmak için nesnesinin ReadXml yöntemini DataSet kullanın. ReadXml yöntemi bir dosyadan, akıştan veya XmlReader'dan okur ve xml kaynağını ve isteğe bağlı bir XmlReadMode bağımsız değişkenini bağımsız değişken olarak alır. XmlReader hakkında daha fazla bilgi için bkz. XmlTextReader ile XML Verilerini Okuma. ReadXml yöntemi XML akışının veya belgesinin içeriğini okur ve DataSet verilerle yükler. Ayrıca belirtilen XmlReadMode'a bağlı olarak ve bir ilişkisel şemanın DataSetzaten var olup olmadığına bağlı olarak öğesinin ilişkisel şemasını oluşturur.

Aşağıdaki tabloda XmlReadMode bağımsız değişkeninin seçenekleri açıklanmaktadır.

Seçenek Açıklama
Auto Bu varsayılan seçenektir. XML'yi inceler ve aşağıdaki sırayla en uygun seçeneği belirler:

- XML bir DiffGram ise, DiffGram kullanılır.
- şema DataSet veya XML satır içi şema içeriyorsa, ReadSchema kullanılır.
- öğesi bir şema içermiyorsa ve XML satır içi şema içermiyorsa DataSet , InferSchema kullanılır.

Okunan XML biçimini biliyorsanız, en iyi performans için Otomatik varsayılanı kabul etmek yerine açık bir XmlReadMode ayarlamanız önerilir.
ReadSchema Tüm satır içi şemaları okur ve verileri ve şemayı yükler.

DataSet zaten bir şema içeriyorsa, satır içi şemadan içindeki DataSetmevcut şemaya yeni tablolar eklenir. Satır içi şemadaki herhangi bir tablo içinde DataSetzaten varsa, bir özel durum oluşturulur. XmlReadMode.ReadSchema kullanarak varolan bir tablonun şemasını değiştiremezsiniz.

DataSet bir şema içermiyorsa ve satır içi şema yoksa, hiçbir veri okunmuyordur.

Satır içi şema, XML Şema tanım dili (XSD) şeması kullanılarak tanımlanabilir. Xml Şeması olarak satır içi şema yazma hakkında ayrıntılı bilgi için bkz . XML Şemasından (XSD) DataSet İlişkisel Yapısını Türetme.
IgnoreSchema Tüm satır içi şemaları yoksayar ve verileri mevcut DataSet şemaya yükler. Mevcut şemayla eşleşmeyen tüm veriler atılır. içinde DataSetşema yoksa, hiçbir veri yüklenmez.

Veriler bir DiffGram ise IgnoreSchema, DiffGram ile aynı işlevselliğe sahiptir.
Inferschema Tüm satır içi şemaları yoksayar ve XML verilerinin yapısına göre şemayı çıkarsar, ardından verileri yükler.

DataSet Zaten bir şema içeriyorsa, mevcut tablolara sütun eklenerek geçerli şema genişletilir. Mevcut tablo yoksa ek tablolar eklenmez. Çıkarılmış bir tablo farklı bir ad alanına sahipse veya çıkarılmış sütunlar mevcut sütunlarla çakışıyorsa bir özel durum oluşturulur.

ReadXmlSchema'nın bir XML belgesinden şemayı nasıl çıkarmasıyla ilgili ayrıntılar için bkz. XML'den DataSet İlişkisel Yapısını Çıkarsama.
Diffgram Bir DiffGram okur ve verileri geçerli şemaya ekler. DiffGram , benzersiz tanımlayıcı değerlerinin eşleştiği mevcut satırlarla yeni satırları birleştirir. Bu konunun sonundaki "XML'den Verileri Birleştirme" bölümüne bakın. DiffGrams hakkında daha fazla bilgi için bkz . DiffGrams.
Parça Akışın sonuna ulaşılana kadar birden çok XML parçasını okumaya devam eder. Şemayla DataSet eşleşen parçalar uygun tablolara eklenir. Şemayla DataSet eşleşmeyen parçalar atılır.

Not

XmlReader'ı bir XML belgesinin yolunun bir parçası olan ReadXml'ye geçirirseniz, ReadXml sonraki öğe düğümüne okur ve bunu yalnızca öğe düğümünün sonuna kadar okuyarak kök öğe olarak kabul eder. XmlReadMode.Fragment belirtirseniz bu geçerli değildir.

DTD Varlıkları

XML'niz bir belge türü tanımı (DTD) şemasında tanımlanmış varlıklar içeriyorsa, bir dosya adı, akış veya XmlReader'ı ReadXml'ye doğrulanmamış olarak geçirerek bir özel DataSet durum oluşturulur. Bunun yerine, EntityHandling EntityHandling.ExpandEntities olarak ayarlanmış bir XmlValidatingReader oluşturmanız ve XmlValidatingReader'ınızı ReadXml'ye geçirmeniz gerekir. XmlValidatingReader, tarafından DataSetokunmadan önce varlıkları genişletir.

Aşağıdaki kod örnekleri bir XML akışından nasıl yükleneceklerini DataSet gösterir. İlk örnekte ReadXml yöntemine geçirilen bir dosya adı gösterilmektedir. İkinci örnekte, kullanılarak yüklenen XML içeren bir StringReaderdize gösterilmektedir.

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

Not

ReadXml'yi çağırarak çok büyük bir dosya yüklerseniz yavaş performansla karşılaşabilirsiniz. ReadXml için en iyi performansı sağlamak için, büyük bir dosyada içindeki her tablonun yöntemini çağırın DataSetBeginLoadData ve ardından ReadXml'yi çağırın. Son olarak, aşağıdaki örnekte gösterildiği gibi içindeki DataSether tablo için çağrısı EndLoadData yapın.

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

Not

Sizin DataSet için XSD şeması bir targetNamespace içeriyorsa veriler okunamayabilir ve uygun ad alanına sahip olmayan öğeleri içeren XML ile yüklemek DataSet için ReadXml'yi çağırırken özel durumlarla karşılaşabilirsiniz. Bu durumda nitelenmemiş öğeleri okumak için elementFormDefault değerini XSD şemanızda "qualified" değerine eşit olarak ayarlayın. Örneğin:

<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'den Veri Birleştirme

DataSet zaten veri içeriyorsa, XML'den alınan yeni veriler içinde DataSetzaten var olan verilere eklenir. ReadXml , XML'den eşleşen birincil anahtarlarla herhangi bir satır bilgisi arasında DataSet birleştirmez. Varolan satır bilgilerinin üzerine XML'den yeni bilgiler yazmak için ReadXml'yi kullanarak yeni DataSetbir oluşturun ve ardından Merge yeniyi DataSet var olan DataSetiçine yazın. ReadXML kullanarak DiffGram'ın XmlReadMode of DiffGram ile yüklenmesinin aynı benzersiz tanımlayıcıya sahip satırları birleştireceğini unutmayın.

Ayrıca bkz.