Home   Cover Cover Cover Cover
 

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.
output