DataSets und XML-Schemas
Zu Abschnitt 5.5.2 des Buchs
Das folgende Beispiel zeigt die unterschiedlichen Möglichkeiten
für das Lesen von Daten und Schemainformation aus XML-Dateien
und wie diese Daten in ein DataSet übernommen werden können.
Es wird dabei ein DataSet, das aus einer Datenbank aufgebaut wurde, mit Schema und
Daten aus XML-Dateien kombiniert. Dazu werden folgende XML-Dateien verwendet:
Es werden nun die folgenden drei Methoden getestet.
- Methode 1: Mit
ReadXml wird versucht, sowohl die Daten als auch das Schema aus der
Datei personMailDataAndSchema.xml zu lesen und ins DateSet aufzunehmen.
- Methode 2: Mit
InferXmlSchema wird aus dem reinem Datenfile
personMailData.xml das Schema ermittelt und mit dem bestehenden Schema
des DataSets kombiniert.
- Methode 3: In dieser Variante wird zuerst mit
ReadXml Schema und Daten aus
der Datei personMailDataAndSchema.xml in ein neues, leeres
DataSet (d2) gelesen. Danach wird dieses DataSet mit dem ursprünglichen DataSet mit Merge
kombiniert.
Das folgende Programm verwendet die zwei Utility-Klassen
DBReader und DataSetPrinter.
5-5-2-ReadAndInferXmlSchemaSample.cs
using System;
using System.Data;
using System.Data.OleDb;
using System.Xml;
namespace Chapter5
{
public class ReadAndInferXmlSchemaSample
{
public static void Main()
{
Console.WriteLine("\n Beispiel zu XmlDaten und Schema mischen!");
Console.WriteLine(" Daten aus DB laden: \n ");
DataSet ds = DBReader.LoadDataFromDB();
DataSetPrinter.Print(ds.Tables["Person"]);
SchemaDemo(ds, "personMailData.xml", "personMailDataAndSchema.xml");
}
//liest die Daten aus der XML-Datei und fuegt sie dem DataSet hinzu
static void SchemaDemo(DataSet ds, string dataFile, string dataAndSchemaFile)
{
try
{
Console.WriteLine("\n METHODE 1: ds.ReadXml(\"{0}\", XmlReadMode.InferSchema); ergibt:\n", dataFile);
ds.ReadXml(dataAndSchemaFile, XmlReadMode.InferSchema);
DataSetPrinter.Print(ds.Tables["Person"]);
}
catch (Exception e)
{
Console.WriteLine("ERROR : {0}", e.Message);
}
ds.RejectChanges();
Console.WriteLine("\n METHODE 2: ds.InferXmlSchema(\"{0}\", ...); ergibt:\n ", dataFile);
ds.InferXmlSchema(dataFile, new string[0]);
DataSetPrinter.Print(ds.Tables["Person"]);
ds.RejectChanges();
Console.WriteLine("\n METHODE 3: ds2.ReadXml + ds.Merge: \n");
DataSet ds2 = new DataSet();
ds2.ReadXml(dataAndSchemaFile); //einthaltenes XML Schema wird automtisch verwendet
Console.WriteLine(" 3.1) ds2.ReadXml(\"{0}\"); ergibt:\n", dataFile);
DataSetPrinter.Print(ds2);
ds.Merge(ds2); //DataTable "Person" aus ds und ds2 haben ID als Schluessel
Console.WriteLine(" 3.2) ds.Merge(ds2) ergibt: \n");
DataSetPrinter.Print(ds.Tables["Person"]);
ds.RejectChanges();
}
}
}
|
Die folgende Ausgabe zeigt die Ergebnisse:
- Die erste Ausgabe zeigt den Inhalt des ursprünglichen DataSets, wie es aus der Datenbank gelesen wurde.
- Die zweite Ausgabe zeigt das Ergebnis bei Anwendung von Methode 1:
Dadurch dass die Spalte ID aber als Primärschlüssel definiert wurde,
kommt es zu einem Konflikt und es wird eine Exception geworfen.
- Die nächste Ausgabe zeigt, dass bei Methode 2 nur das Schema um die Spalte Email erweitert wurde.
- Die Ausgabe für Methode 3 zeigt uns, dass diese Methode das richtige Ergebnis liefert.
Durch die Kombination der Daten mit der Methode
Merge werden die Daten so zusammengeführt,
wie wir das erwarten.
|