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