Laden eines "DataSets" aus XML
Der Inhalt eines ADO.NET-DataSet kann aus einem XML-Stream oder einem XML-Dokument erstellt werden. Außerdem können Sie mit .NET Framework größtenteils festlegen, welche Informationen aus der XML-Quelle geladen werden sollen und wie das Schema oder die relationale Struktur des DataSet erstellt werden soll.
Verwenden Sie zum Füllen eines DataSet mit Daten aus einer XML-Quelle die ReadXml-Methode des DataSet-Objekts. Die ReadXml-Methode liest Daten aus einer Datei, einem Stream oder einem XmlReader und verwendet die Quelle der XML-Daten sowie ein optionales XmlReadMode-Argument als Argumente. Weitere Informationen zum XmlReader finden Sie unter Lesen von XML-Daten mit XmlTextReader. Die ReadXml-Methode liest den Inhalt des XML-Streams oder des XML-Dokuments und füllt das DataSet mit Daten. In Abhängigkeit vom angegebenen XmlReadMode und vom Vorhandensein eines relationalen Schemas erstellt die Methode außerdem das relationale Schema des DataSet.
In der folgenden Tabelle werden die Optionen für das XmlReadMode-Argument beschrieben.
Option | BESCHREIBUNG |
---|---|
Automatisch | Dies ist die Standardoption. Prüft die XML-Daten und wählt die am besten geeignete Option in der folgenden Reihenfolge aus: – Wenn die XML-Daten im DiffGram-Format vorliegen, wird DiffGram verwendet. – Wenn das DataSet ein Schema enthält oder die XML-Daten ein Inlineschema besitzen, wird ReadSchema verwendet. – Wenn das DataSet kein Schema enthält und die XML-Daten kein Inlineschema besitzen, wird InferSchema verwendet. Wenn Sie das Format der gelesenen XML-Daten kennen, besteht die effizienteste Methode darin, anstelle der Standardeinstellung Auto ein explizites XmlReadMode-Argument anzugeben. |
ReadSchema | Liest beliebige Inlineschemata und lädt Daten und Schemata. Wenn das DataSet bereits ein Schema enthält, werden neue Tabellen aus dem Inlineschema zum vorhandenen Schema im DataSet hinzugefügt. Wenn bereits Tabellen im Inlineschema des DataSet vorhanden sind, wird eine Ausnahme ausgelöst. Sie können das Schema einer vorhandenen Tabelle nicht mit XmlReadMode.ReadSchema ändern. Wenn das DataSet kein Schema enthält und kein Inlineschema vorhanden ist, werden keine Daten gelesen. Ein Inlineschema kann mit dem XSD-Schema (XML Schema Definition Language) definiert werden. Ausführliche Informationen zum Schreiben eines Inlineschemas als XML-Schema finden Sie unter Ableiten der relationalen DataSet-Struktur vom XML-Schema (XSD). |
IgnoreSchema | Ignoriert alle Inlineschemata und lädt die Daten in das vorhandene DataSet-Schema. Daten, die nicht mit dem vorhandenen Schema übereinstimmen, werden gelöscht. Wenn kein Schema im DataSet vorhanden ist, werden keine Daten geladen. Wenn es sich bei den Daten um DiffGram-Daten handelt, hat IgnoreSchema dieselbe Funktion wie DiffGram . |
InferSchema | Ignoriert alle Inlineschemata, leitet das Schema aus der Struktur der XML-Daten ab und lädt anschließend die Daten. Wenn das DataSet bereits ein Schema enthält, wird das aktuelle Schema durch Hinzufügen von Spalten zu den vorhandenen Tabellen erweitert. Wenn keine Tabellen vorhanden sind, werden keine zusätzlichen Tabellen hinzugefügt. Eine Ausnahme wird ausgelöst, wenn bereits eine hergeleitete Tabelle mit einem anderen Namespace vorhanden ist oder wenn hergeleitete Spalten mit vorhandenen Spalten kollidieren. Ausführliche Informationen dazu, wie ReadXmlSchema aus einem XML-Dokument auf ein Schema rückschließt, finden Sie unter Rückschließen der relationalen DataSet-Struktur aus XML. |
DiffGram | Liest ein DiffGram und fügt die Daten dem aktuellen Schema hinzu. DiffGram führt neue Zeilen mit vorhandenen Zeilen zusammen, bei denen die eindeutigen Bezeichnerwerte übereinstimmen. Informationen hierzu finden Sie unter "Zusammenführen von Daten aus XML-Dokumenten" am Ende dieses Themas. Weitere Informationen zu DiffGrams finden Sie unter DiffGrams. |
Fragment | Setzt den Lesevorgang für mehrere XML-Fragmente fort, bis das Ende des Streams erreicht ist. Fragmente, die mit dem DataSet-Schema übereinstimmen, werden an die entsprechenden Tabellen angehängt. Fragmente, die nicht mit dem DataSet-Schema übereinstimmen, werden gelöscht. |
Hinweis
Wenn Sie einen XmlReader an ReadXml übergeben, das sich auf dem Weg zu einem XML-Dokument befindet, liest ReadXml bis zum nächsten Elementknoten, behandelt diesen als Stammelement und liest dann nur noch bis zum Ende des Elementknotens. Dies trifft nicht zu, wenn Sie XmlReadMode.Fragment verwenden.
DTD-Entitäten
Bei einem XML-Dokument mit Entitäten, die in einem DTD-Schema (Document Type Definition) definiert sind, wird eine Ausnahme ausgelöst, wenn Sie versuchen, ein DataSet zu laden, indem Sie einen Dateinamen, einen Stream oder einen nicht validierten XmlReader an ReadXml übergeben. Erstellen Sie stattdessen einen XmlValidatingReader, bei dem EntityHandling auf EntityHandling.ExpandEntities festgelegt ist, und übergeben Sie anschließend den XmlValidatingReader an ReadXml. Der XmlValidatingReader erweitert die Entitäten, bevor er vom DataSet gelesen wird.
In den folgenden Codebeispielen wird dargestellt, wie ein DataSet aus einem XML-Stream geladen wird. Im ersten Beispiel wird ein Dateiname an die ReadXml-Methode übergeben. Im zweiten Beispiel wird eine Zeichenfolge mit XML-Daten mithilfe eines StringReader geladen.
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);
Hinweis
Wenn für das Laden einer sehr großen Datei ReadXml aufgerufen wird, führt dies möglicherweise zu einem Leistungsabfall. Damit ReadXml mit optimaler Effizienz verwendet werden kann, rufen Sie bei einer großen Datei zunächst die BeginLoadData-Methode für jede Tabelle im DataSet auf, und rufen Sie anschließend ReadXml auf. Rufen Sie zum Schluss EndLoadData für jede Tabelle im DataSet auf. Dies wird im folgenden Beispiel dargestellt.
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();
Hinweis
Wenn zum XSD-Schema für das DataSet ein targetNamespace gehört, werden die Daten möglicherweise nicht gelesen. Außerdem können Ausnahmen ausgelöst werden, wenn Sie ReadXml zum Laden des DataSet mit XML aufrufen, das Elemente ohne qualifizierenden Namespace enthält. Damit in diesem Fall nicht qualifizierte Elemente gelesen werden können, legen Sie im XSD-Schema elementFormDefault auf „qualified“ fest. Beispiel:
<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>
Zusammenführen von Daten aus XML-Dokumenten
Wenn das DataSet bereits Daten enthält, werden die neuen Daten aus der XML-Quelle den im DataSet bereits vorhandenen Daten hinzugefügt. ReadXml fügt keine Zeileninformationen mit übereinstimmenden Primärschlüsseln aus dem XML-Dokument in das DataSet ein. Wenn vorhandene Zeileninformationen mit neuen XML-Informationen überschrieben werden sollen, müssen Sie mit ReadXml zunächst ein neues DataSet erstellen. Führen Sie anschließend einen Merge-Vorgang aus, um das neue DataSet mit dem vorhandenen DataSet zusammenzuführen. Wenn Sie ein DiffGram mit ReadXML laden und XmlReadMode auf DiffGram festgelegt ist, werden die Zeilen mit identischem Bezeichner zusammengeführt.
Siehe auch
- DataSet.Merge
- Using XML in a DataSet (Verwenden von XML in einem DataSet)
- DiffGrams
- Ableiten einer relationalen DataSet-Struktur aus einem XML-Schema (XSD)
- Ableiten einer relationalen DataSet-Struktur aus einem XML-Schema
- Laden von DataSet-Schemainformationen aus XML
- "DataSets", "DataTables" und "DataViews"
- Übersicht über ADO.NET