Megosztás a következőn keresztül:


Adathalmaz betöltése XML-ből

A ADO.NET DataSet tartalma XML-adatfolyamból vagy dokumentumból hozható létre. Emellett a .NET-keretrendszer nagy rugalmassággal rendelkezik az XML-ből betöltött információk, valamint a séma vagy a DataSet relációs struktúra létrehozásának módjával kapcsolatban.

Ha XML-ből szeretne adatokat kitölteniDataSet, használja az DataSet objektum ReadXml metódusát. A ReadXml metódus fájlból, streamből vagy XmlReaderből olvas be, és argumentumként az XML forrását és egy opcionális XmlReadMode argumentumot veszi fel. Az XmlReaderrel kapcsolatos további információkért lásd: XML-adatok olvasása az XmlTextReaderrel. A ReadXml metódus beolvassa az XML-adatfolyam vagy -dokumentum tartalmát, és betölti az DataSet adatokat. Emellett létrehozza a megadott XmlReadMode-hez tartozó relációs sémátDataSet, valamint azt is, hogy létezik-e már relációs séma.

Az alábbi táblázat az XmlReadMode argumentum beállításait ismerteti.

Lehetőség Leírás
Auto Ez az alapértelmezett beállítás. Megvizsgálja az XML-t, és az alábbi sorrendben választja ki a legmegfelelőbb beállítást:

- Ha az XML egy DiffGram, akkor a DiffGramot használja a rendszer.
– Ha a DataSet séma vagy az XML beágyazott sémát tartalmaz, a ReadSchema lesz használatban.
– Ha a DataSet rendszer nem tartalmaz sémát, és az XML nem tartalmaz beágyazott sémát, az InferSchema lesz használatban.

Ha ismeri az éppen beolvasott XML formátumát, a legjobb teljesítmény érdekében ajánlott explicit XmlReadMode-t beállítani ahelyett, hogy elfogadná az automatikus alapértelmezett beállítást.
ReadSchema Beolvassa a beágyazott sémákat, és betölti az adatokat és a sémát.

Ha a DataSet már tartalmaz sémát, a rendszer új táblákat ad hozzá a beágyazott sémából a meglévő sémához.DataSet Ha a beágyazott sémában már vannak táblák, a DataSetrendszer kivételt jelez. Nem fogja tudni módosítani egy meglévő tábla sémáját az XmlReadMode.ReadSchema használatával.

Ha a DataSet rendszer nem tartalmaz sémát, és nincs beágyazott séma, a rendszer nem olvas be adatokat.

A beágyazott séma xml-sémadefiníciós (XSD) sémával határozható meg. A beágyazott sémák XML-sémaként való írásával kapcsolatos részletekért lásd: DataSet Relational Structure from XML Schema (XSD) (DataSet Relational Structure from XML Schema, XSD).
IgnoreSchema Figyelmen kívül hagyja a beágyazott sémákat, és betölti az adatokat a meglévő DataSet sémába. A rendszer elvet minden olyan adatot, amely nem egyezik a meglévő sémával. Ha nincs séma a fájlban, a DataSetrendszer nem tölt be adatokat.

Ha az adatok DiffGramok, az IgnoreSchema ugyanazokkal a funkciókkal rendelkezik, mint a DiffGram.
InferSchema Figyelmen kívül hagyja a beágyazott sémákat, és az XML-adatok struktúrája alapján következtet a sémára, majd betölti az adatokat.

Ha a DataSet séma már tartalmaz sémát, az aktuális séma kiterjeszthető úgy, hogy oszlopokat ad hozzá a meglévő táblákhoz. Ha nincsenek meglévő táblák, a program nem ad hozzá további táblákat. Kivétel akkor keletkezik, ha egy kikövetkeztetett tábla már létezik egy másik névtérrel, vagy ha a kikövetkeztetett oszlopok ütköznek a meglévő oszlopokkal.

További információ arról, hogy a ReadXmlSchema hogyan következtet egy sémára egy XML-dokumentumból: Adathalmaz relációs struktúrájának következtetése XML-ből.
DiffGram Beolvassa a DiffGramot, és hozzáadja az adatokat az aktuális sémához. A DiffGram egyesíti az új sorokat a meglévő sorokkal, ahol az egyedi azonosítóértékek egyeznek. Lásd a témakör végén található "Adatok egyesítése XML-ből" című témakört. A DiffGrams szolgáltatással kapcsolatos további információkért lásd: DiffGrams.
Töredék Több XML-töredék olvasása a stream végéig folytatódik. A sémának megfelelő DataSet töredékek hozzá vannak fűzve a megfelelő táblákhoz. A rendszer elveti a DataSet sémával nem egyező töredékeket.

Feljegyzés

Ha átad egy XmlReadert a ReadXmlnek, amely az út egy része egy XML-dokumentumba kerül, a ReadXml beolvassa a következő elemcsomópontba, és ezt gyökérelemként kezeli, és csak az elemcsomópont végéig olvassa fel. Ez nem érvényes, ha xmlReadMode.Fragment értéket ad meg.

DTD-entitások

Ha az XML egy dokumentumtípus-definíciós (DTD-) sémában definiált entitásokat tartalmaz, akkor a rendszer kivételt fog kivenni, ha fájlnevet, streamet vagy nem érvényesítő XmlReadert próbál betölteni DataSet a ReadXmlnek. Ehelyett létre kell hoznia egy XmlValidatingReadert, amelynek EntityHandling.ExpandEntities értékére van állítva az EntityHandling.ExpandEntities, és át kell adnia az XmlValidatingReadert a ReadXml-nek. Az XmlValidatingReader kibontja az entitásokat, mielőtt a program beolvassa őket DataSet.

Az alábbi példakód bemutatja, hogyan tölthet be egy DataSet XML-adatfolyamból. Az első példa egy fájlnevet mutat be, amely a ReadXml metódusnak van átadva. A második példa egy XML-t tartalmazó sztringet mutat be egy 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);  

Feljegyzés

Ha meghívja a ReadXml-et egy nagyon nagy fájl betöltésére, előfordulhat, hogy lassú teljesítmény tapasztalható. A ReadXml legjobb teljesítményének biztosítása érdekében egy nagy fájlban hívja meg a BeginLoadData metódust a táblában, majd hívja meg a DataSetReadXml parancsot. Végül hívjon meg EndLoadData minden táblát a DataSetkövetkező példában látható módon.

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

Feljegyzés

Ha az XSD-séma DataSet tartalmaz egy targetNamespace-t, előfordulhat, hogy az adatok nem lesznek beolvasva, és kivételeket tapasztalhat, amikor meghívja a ReadXml-et a DataSet megfelelő névtér nélküli elemeket tartalmazó XML-fájl betöltésére. Ha ebben az esetben nem minősített elemeket szeretne olvasni, állítsa be az ElemFormDefault értéket az XSD-sémában a "minősített" értékkel. Példa:

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

Adatok egyesítése XML-ből

Ha a DataSet már tartalmaz adatokat, a rendszer hozzáadja az XML-ből származó új adatokat a már meglévő adatokhoz.DataSet A ReadXml nem egyesül az XML-ből az DataSet egyező elsődleges kulcsokkal rendelkező sorinformációkba. Ha felülírni szeretné a meglévő soradatokat az XML-ből származó új információkkal, a ReadXml használatával hozzon létre egy újatDataSet, majd Merge az újat DataSet a meglévőbeDataSet. Vegye figyelembe, hogy a DiffGram ReadXML használatával történő betöltése a DiffGram XmlReadMode-jával azonos egyedi azonosítójú sorokat egyesít.

Lásd még