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.