Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 .
Pro vyplnění dat do DataSet z XML použijte metodu ReadXml objektu DataSet. Metoda ReadXml čte ze souboru, datového proudu nebo XmlReader a přebírá jako argumenty zdroj XML plus volitelný XmlReadMode argument. Další informace o XmlReader naleznete v tématu Čtení XML Data pomocí XmlTextReader. Metoda ReadXml čte obsah datového proudu XML nebo dokumentu a naplní DataSet daty. Vytvoří se také relační schéma DataSet v závislosti na specifikovaném XmlReadMode a na tom, zda již relační schéma existuje.
Následující tabulka popisuje možnosti argumentu XmlReadMode .
| Možnost | Popis |
|---|---|
| Automatické | 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, ReadSchema použije se.- Pokud neobsahuje DataSet schéma a XML neobsahuje vložené schéma, InferSchema použije se.Pokud znáte formát xml, který se čte, doporučujeme pro zajištění nejlepšího výkonu nastavit explicitní Auto, nikoli přijmout výchozí. |
| ReadSchema | Načte jakékoli integrované schéma a zavede data a schéma. Pokud DataSet již obsahuje schéma, nové tabulky se přidají z vloženého schématu do existujícího schématu v DataSet. Pokud některé tabulky ve vloženém schématu již existují v objektu DataSet, je vyvolána výjimka. Schéma existující tabulky nebude možné upravit pomocí XmlReadMode.ReadSchema. Pokud DataSet neobsahuje schéma a není k dispozici žá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 DataSet neexistuje žádné schéma, nenačtou se žádná data. Pokud jsou data DiffGram, IgnoreSchema mají stejné funkce jako DiffGram. |
| InferSchema | 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, ve kterých 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 v pozici uvnitř dokumentu XML, ReadXml přečte k dalšímu uzlu elementu a bude jej považovat za kořenový element, čímž bude číst až do konce uzlu elementu. To neplatí, pokud zadáte XmlReadMode.Fragment.
DTD entity
Pokud vaše XML obsahuje entity definované v rámci schématu definice typu dokumentu (DTD), bude vyvolána výjimka, pokud se pokusíte načíst DataSet pomocí názvu souboru, datového proudu nebo neověřujícího XmlReader v ReadXml. Místo toho musíte vytvořit XmlValidatingReader s EntityHandling nastaveným na EntityHandling.ExpandEntities a předat váš XmlValidatingReader do ReadXml.
XmlValidatingReader rozšíří entity před tím, než je DataSet přečte.
Následující příklady kódu ukazují, jak načíst DataSet z datového proudu XML. První příklad ukazuje název souboru, který se předá metodě ReadXml . Druhý příklad ukazuje řetězec, který obsahuje XML, které se načítá 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, výkon může být pomalý. 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 čtena a můžete narazit na výjimky, když voláte ReadXml k načtení DataSet obsahujícího XML s elementy bez určení oboru názvů. Chcete-li číst nekvalifikované prvky v tomto případě, nastavte ve schématu XSD hodnotu elementFormDefault na "qualified". 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 o řá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ího DataSet. Všimněte si, že načtení diffGramu pomocí ReadXML sloučí XmlReadModeDiffGram řádky se stejným jedinečným identifikátorem.