Načtení datové sady z XML

Obsah ADO.NET DataSet lze vytvořit ze streamu XML nebo dokumentu. Kromě toho s rozhraním .NET Framework máte velkou flexibilitu nad tím, jaké informace se načtou z XML a jak se vytvoří schéma nebo relační struktura DataSet .

Chcete-li vyplnit DataSet data z XML, použijte ReadXml metoda objektu DataSet . Metoda ReadXml čte ze souboru, datového proudu nebo XmlReader a přebírá jako argumenty zdroj XML plus volitelný argument XmlReadMode . Další informace o XmlReader naleznete v tématu Čtení XML Data pomocí XmlTextReader. Metoda ReadXml čte obsah datového proudu XML nebo dokumentu a načte DataSet data. Vytvoří také relační schéma DataSet v závislosti na zadaném xmlReadMode a zda relační schéma již existuje.

Následující tabulka popisuje možnosti argumentu XmlReadMode .

Možnost Popis
Auto Tato možnost je výchozí. Zkontroluje KÓD XML a zvolí nejvhodnější možnost v následujícím pořadí:

- Pokud je XML diffGram, použije se diffGram .
- Pokud DataSet obsahuje schéma nebo XML obsahuje vložené schéma, použije se ReadSchema .
- Pokud neobsahuje DataSet schéma a XML neobsahuje vložené schéma, použije se inferSchema .

Pokud znáte formát xml, který se čte, doporučujeme, abyste pro zajištění nejlepšího výkonu nastavili explicitní XmlReadMode, a neakceptujte automatické výchozí nastavení.
ReadSchema Načte jakékoli vložené schéma a načte data a schéma.

DataSet Pokud již obsahuje schéma, nové tabulky se přidají z vloženého schématu do existujícího schématu v objektu DataSet. Pokud některé tabulky ve vložené schématu již existují v objektu DataSet, je vyvolán výjimka. Schéma existující tabulky nebude možné upravit pomocí XmlReadMode.ReadSchema.

DataSet Pokud schéma neobsahuje a neexistuje žádné vložené schéma, nebudou načtena žádná data.

Vložené schéma lze definovat pomocí schématu XSD (XML Schema Definition Language). Podrobnosti o zápisu vloženého schématu jako schématu XML naleznete v tématu Odvození relační struktury datové sady ze schématu XML (XSD).
IgnoreSchema Ignoruje všechna vložená schémata a načte data do existujícího DataSet schématu. Všechna data, která neodpovídají existujícímu schématu, se zahodí. Pokud v objektu neexistuje žádné schéma, nenačtou DataSetse žádná data.

Pokud jsou data DiffGram, má IgnoreSchema stejné funkce jako DiffGram.
OdvozeníSchema Ignoruje všechna vložená schémata a odvodí schéma podle struktury dat XML a pak načte data.

DataSet Pokud již schéma obsahuje, aktuální schéma se rozšíří přidáním sloupců do existujících tabulek. Pokud neexistují existující tabulky, nepřidají se nadbytečné tabulky. Výjimka se vyvolá, pokud odvozená tabulka již existuje s jiným oborem názvů nebo pokud jsou některé odvozené sloupce v konfliktu s existujícími sloupci.

Podrobnosti o tom, jak ReadXmlSchema odvodí schéma z dokumentu XML, naleznete v tématu Odvození relační struktury datové sady z XML.
Diffgram Přečte DiffGram a přidá data do aktuálního schématu. DiffGram sloučí nové řádky s existujícími řádky, kde se shodují hodnoty jedinečného identifikátoru. Viz "Sloučení dat z XML" na konci tohoto tématu. Další informace o diffGrams naleznete v tématu DiffGrams.
Fragment Pokračuje ve čtení více fragmentů XML až do dosažení konce datového proudu. Fragmenty, které odpovídají schématu DataSet , jsou připojeny k příslušným tabulkám. Fragmenty, které neodpovídají schématu DataSet , se zahodí.

Poznámka:

Pokud předáte XmlReaderreadXml , který je umístěná část cesty do dokumentu XML, ReadXml přečte do dalšího uzlu elementu a bude považovat za kořenový prvek, čtení až do konce uzlu elementu. To neplatí, pokud zadáte XmlReadMode.Fragment.

Entity DTD

Pokud xml obsahuje entity definované ve schématu definice typu dokumentu (DTD), vyvolá se výjimka, pokud se pokusíte načíst DataSet název souboru, stream nebo neověřící XmlReader do ReadXml. Místo toho musíte vytvořit XmlValidatingReader s EntityHandling nastavena na EntityHandling.ExpandEntities a předat XmlValidatingReader ReadXml. XmlValidatingReader rozbalí entity před čtením DataSet.

Následující příklady kódu ukazují, jak načíst DataSet datový proud XML. První příklad ukazuje název souboru předávaný metodě ReadXml . Druhý příklad ukazuje řetězec, který obsahuje XML načten pomocí 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);  

Poznámka:

Pokud zavoláte ReadXml pro načtení velmi velkého souboru, může dojít k pomalému výkonu. Chcete-li zajistit nejlepší výkon pro ReadXml, ve velkém souboru, zavolejte metodu BeginLoadData pro každou tabulku v souboru DataSeta pak volejte ReadXml. Nakonec volejte EndLoadData pro každou tabulku v tabulce DataSet, jak je znázorněno v následujícím příkladu.

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

Poznámka:

Pokud schéma XSD pro vaše DataSet zahrnuje targetNamespace, data nemusí být přečtena a může dojít k výjimkám při volání ReadXml pro načtení DataSet s XML, který obsahuje elementy bez opravňujícího oboru názvů. Chcete-li číst nekvalifikované elementy v tomto případě, nastavte elementFormDefault na "kvalifikovaný" ve schématu XSD. Příklad:

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

Sloučení dat z XML

DataSet Pokud již obsahuje data, nová data z XML se přidají do dat, která již existují v souboru DataSet. ReadXml nesloučí z XML do DataSet žádné informace řádku s odpovídajícími primárními klíči. Chcete-li přepsat existující informace o řádku novými informacemi z XML, použijte ReadXml k vytvoření nového DataSeta pak Merge nový DataSet do existující DataSet. Všimněte si, že načtení diffGramu pomocí readXML s XmlReadMode diffGram sloučí řádky se stejným jedinečným identifikátorem.

Viz také