Freigeben über


Laden eines DataSets aus XML

Der Inhalt eines ADO.NET-DataSets 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 DataSets erstellt wird.

Zum Füllen eines DataSets mit Daten aus einer XML-Quelle verwenden Sie 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 über XmlReader finden Sie unter Lesen von XML-Daten mit XmlTextReader.) Die ReadXml-Methode liest den Inhalt des XML-Streams oder -Dokuments und füllt das DataSet mit Daten. Sie erstellt außerdem das relationale Schema des DataSets abhängig vom angegebenen XmlReadMode und vom Vorhandensein eines relationalen Schemas.

In der folgenden Tabelle werden die Optionen für das XmlReadMode-Argument beschrieben.

XmlReadMode Beschreibung
Auto Dies ist die Standardeinstellung. Prüft die XML-Daten und wählt die am besten geeignete Option in der folgenden Reihenfolge:
  • Wenn die XML-Daten im DiffGram-Format vorliegen, wird DiffGram verwendet.
  • Wenn das DataSet ein Schema enthält oder die XML-Daten ein Inline-Schema besitzen, wird ReadSchema verwendet
  • Wenn das DataSet kein Schema enthält und die XML-Daten kein Inline-Schema besitzen, wird InferSchema verwendet.

Wenn Sie das Format der gelesenen XML-Daten kennen, erzielen Sie die beste Leistung, indem Sie ein explizites XmlReadMode-Argument angeben und nicht die Standardeinstellung Auto verwenden.

ReadSchema Liest das Inline-Schema und lädt Daten und Schemas.

Wenn das DataSet bereits ein Schema enthält, werden neue Tabellen aus dem Inline-Schema zum bestehenden Schema im DataSet hinzugefügt. Wenn bereits Tabellen im Inline-Schema des DataSets vorhanden sind, wird eine Ausnahme ausgelöst. Sie können das Schema einer bestehenden Tabelle nicht mit XmlReadMode.ReadSchema ändern.

Wenn das DataSet kein Schema enthält und kein Inline-Schema vorhanden ist, werden keine Daten gelesen.

Ein Inline-Schema kann mit dem XML Schema Definition (XSD)-Sprachschema definiert werden. Einzelheiten über das Schreiben eines Inline-Schemas als XML-Schema finden Sie unter Generieren einer relationalen DataSet-Struktur aus einem XML-Schema (XSD).

IgnoreSchema Ignoriert Inline-Schemas und lädt die Daten in das bestehende 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 Inline-Schemas, leitet das Schema aus der Struktur der XML-Daten ab und lädt die Daten.

Wenn das DataSet bereits ein Schema enthält, wird das aktuelle Schema erweitert, indem neue Tabellen hinzugefügt werden, sofern noch keine Tabelle vorhanden ist, oder indem Spalten zu bestehenden Tabellen hinzugefügt werden. Eine Ausnahme wird ausgelöst, wenn bereits eine hergeleitete Tabelle mit einem anderen Namespace vorhanden ist oder wenn hergeleitete Spalten mit bestehenden Spalten kollidieren.

Einzelheiten darüber, wie ReadXmlSchema ein Schema von einem XML-Dokument herleitet, finden Sie unter Herleiten der relationalen DataSet-Struktur aus XML.

DiffGram Liest ein DiffGram und fügt die Daten zum aktuellen Schema hinzu. DiffGram führt neue Zeilen mit bestehenden Zeilen zusammen, wenn die eindeutigen Bezeichnerwerte übereinstimmen (siehe hierzu die Informationen unter "Zusammenführen von Daten aus XML-Dokumenten" am Ende dieses Themas). Weitere Informationen über DiffGrams finden Sie unter DiffGrams.
Fragment Fährt mit dem Lesen mehrerer 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 die ReadXml-Methode übergeben, die sich innerhalb eines XML-Dokuments befindet, liest die ReadXml bis zum nächsten Elementknoten, behandelt diesen als Stammelement und liest dann nur 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 Schema für eine Dokumenttypdefinition (DTD) definiert sind, wird eine Ausnahme ausgelöst, wenn Sie versuchen, ein DataSet zu laden, indem Sie einen Dateinamen, einen Stream oder einen nicht überprüfenden XmlReader an ReadXml übergeben. Stattdessen müssen Sie einen XmlValidatingReader erstellen, bei dem EntityHandling auf EntityHandling.ExpandEntities festgelegt ist, und den XmlValidatingReader an ReadXml übergeben. Der XmlValidatingReader erweitert die Entitäten, bevor er vom DataSet gelesen wird.

Die folgenden Codebeispiele zeigen, wie ein DataSet aus einem XML-Stream geladen wird. Das erste Beispiel veranschaulicht die Übergabe eines Dateinamens an die ReadXml-Methode. Das zweite Beispiel zeigt eine Zeichenfolge mit XML-Daten, die mit einem System.IO.StringReader geladen wird.

Dim myDS As DataSet = New DataSet
myDS.ReadXml("input.xml", XmlReadMode.ReadSchema)
[C#]
DataSet myDS = new DataSet();
myDS.ReadXml("input.xml", XmlReadMode.ReadSchema);
[Visual Basic]
Dim myDS As DataSet = New DataSet
Dim myTable As DataTable = New DataTable("table1")
myTable.Columns.Add("col1", Type.GetType("System.String"))
myDS.Tables.Add(myTable)

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)

myDS.ReadXml(xmlSR, XmlReadMode.IgnoreSchema)
[C#]
DataSet myDS = new DataSet();
DataTable myTable = new DataTable("table1");
myTable.Columns.Add("col1", typeof(string));
myDS.Tables.Add(myTable);

string xmlData = "<XmlDS><table1><col1>Value1</col1></table1><table1><col1>Value2</col1></table1></XmlDS>";

System.IO.StringReader xmlSR = new System.IO.StringReader(xmlData);

myDS.ReadXml(xmlSR, XmlReadMode.IgnoreSchema);

Hinweis   Wenn für das Laden einer sehr großen Datei ReadXml aufgerufen wird, ist dies möglicherweise Leistungseinbußen verbunden. Um die beste Leistung für ReadXml sicherzustellen, rufen Sie für eine große Datei die DataTable.BeginLoadData-Methode für jede Tabelle im DataSet und dann ReadXml auf. Rufen Sie zuletzt DataTable.EndLoadData für jede Tabelle im DataSet auf, wie das folgende Beispiel zeigt.

Dim t As DataTable

For Each t In ds.Tables
  t.BeginLoadData()
Next

ds.ReadXml("file.xml")

For Each t in ds.Tables
  t.EndLoadData()
Next
[C#]
foreach (DataTable t in ds.Tables)
  t.BeginLoadData();

ds.ReadXml("file.xml"); 

foreach (DataTable t in ds.Tables)
  t.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 DataSets mit XML aufrufen, das Elemente ohne kennzeichnenden Namespace enthält. Um in diesem Fall nicht gekennzeichnete Elemente lesen zu können, legen Sie im XSD-Schema elementFormDefault auf qualified fest. Beispiel:

<xsd:schema id="MyDataSet" 
  elementFormDefault="qualified"
  targetNamespace="http://www.tempuri.org/MyDataSet.xsd" 
  xmlns="http://www.tempuri.org/MyDataSet.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 dem XML-Dokument zu den bereits vorhandenen Daten im DataSet hinzugefügt. ReadXml fügt keine Zeileninformationen mit übereinstimmenden Primärschlüsseln aus dem XML-Dokument in das DataSet ein. Um bestehende Zeileninformationen mit neuen Informationen aus einem XML-Dokument zu überschreiben, müssen Sie mit ReadXml zunächst ein neues DataSet erstellen. Führen Sie anschließend einen Merge durch, um das neue DataSet mit dem vorhandenen DataSet zusammenzuführen. Wenn Sie ein DiffGram mit ReadXML laden, und XmlReadMode auf DiffGram festgelegt ist, werden Zeilen mit identischem Bezeichner zusammengeführt.

Siehe auch

XML und das DataSet | DiffGrams | Generieren einer relationalen DataSet-Struktur aus einem XML-Schema (XSD) | Herleiten der relationalen DataSet-Struktur aus XML | Laden von DataSet-Schemainformationen aus XML | DataSet.Merge-Methode | Erstellen und Verwenden von DataSets