Freigeben über


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 Ausfüllen von DataSet Daten aus XML die ReadXml Methode des DataSet Objekts. Die ReadXml Methode liest aus einer Datei, einem Datenstrom oder einem XmlReader und verwendet als Argumente die Quelle des XML plus ein optionales XmlReadMode Argument. Weitere Informationen zum XmlReader finden Sie unter Lesen von XML-Daten mit XmlTextReader. Die ReadXml Methode liest den Inhalt des XML-Datenstroms oder Dokuments und lädt die DataSet mit Daten. Abhängig von dem angegebenen XmlReadMode wird auch das relationale Schema des DataSet erstellt, falls noch kein relationales Schema vorhanden ist.

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

Auswahlmöglichkeit 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 der XML-Code ein DiffGram ist, DiffGram wird verwendet.
- Wenn das DataSet ein Schema enthält oder das XML ein Inlineschema hat, wird ReadSchema verwendet.
- Wenn das DataSet kein Schema enthält und die XML kein Inlineschema hat, wird InferSchema verwendet.

Wenn Sie das zu lesende XML-Format kennen, empfiehlt es sich, eine explizite XmlReadMode festzulegen, anstatt die Auto Standardeinstellung zu akzeptieren.
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 ein DiffGram handelt, IgnoreSchema hat die gleiche Funktionalität 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 ein Schema aus einem XML-Dokument abgeleitet wird, finden Sie unter Inferring DataSet Relational Structure from 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 ein XmlReader an ReadXml übergeben und dieser Teil eines bereits begonnenen XML-Dokuments ist, wird ReadXml zum nächsten Elementknoten lesen und diesen als das Stammelement behandeln, wobei nur bis zum Ende des Elementknotens gelesen wird. Dies trifft nicht zu, wenn Sie XmlReadMode.Fragment verwenden.

DTD-Entitäten

Wenn Ihr XML Entitäten enthält, die in einem DTD-Schema (Document Type Definition) definiert sind, wird eine Ausnahme ausgelöst, wenn Sie versuchen, einen DataSet Dateinamen, einen Datenstrom oder eine ungültige XmlReader Überprüfung an ReadXml zu laden. Stattdessen müssen Sie einen XmlValidatingReader erstellen, EntityHandling auf EntityHandling.ExpandEntities festlegen und dann Ihren XmlValidatingReader an ReadXml übergeben. Die Entitäten der XmlValidatingReader werden erweitert, bevor sie von der DataSet gelesen werden.

In den folgenden Codebeispielen wird dargestellt, wie ein DataSet aus einem XML-Stream geladen wird. Das erste Beispiel zeigt einen Dateinamen, der an die ReadXml Methode übergeben wird. 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 Sie ReadXml aufrufen, um eine sehr große Datei zu laden, kann es zu langsamer Leistung kommen. 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 das XSD-Schema für Ihr DataSet einen targetNamespace enthält, werden die Daten möglicherweise nicht gelesen, und es treten möglicherweise Ausnahmen auf, wenn ReadXml aufgerufen wird, um das DataSet mit XML zu laden, das Elemente ohne qualifizierenden Namespace enthält. Um in diesem Fall nicht qualifizierte Elemente zu lesen, setzen Sie elementFormDefault in Ihrem XSD-Schema auf "qualifiziert". 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 übernimmt aus dem XML-Dokument in DataSet keine Zeileninformationen mit übereinstimmenden Primärschlüsseln. Wenn Sie vorhandene Zeileninformationen mit neuen Informationen aus XML überschreiben möchten, verwenden Sie ReadXml, um eine neue DataSet zu erstellen, und fügen Sie dann Merge die neue DataSet in die vorhandene DataSet ein. Beachten Sie, dass das Laden eines DiffGram mit einem ReadXML und einem XmlReadMode von DiffGram Zeilen mit demselben eindeutigen Bezeichner zusammenführt.

Siehe auch