Bestellungen per XmlReader einlesen

Mit dem XmlReader durchlaufen Sie ein XML-Dokument Element für Element. Da dies recht unflexibel ist, müssen wir beim Einlesen verschachtelter XML-Dokumente umso flexibler programmieren. Dieser Artikel zeigt, wie Sie die Daten eines XML-Dokuments mit Kunden, Bestellungen, Bestellpositionen und Artikeln per XmlReader zuerst in ein Entity Data Model einlesen und die Daten von dort in den zugrunde liegenden Tabellen speichern.

Zu importierendes XML-Dokument

Das XML-Dokument, dessen Daten wir importieren wollen, hat ein Stammelement namens Bestellverwaltung. Darunter finden wir ein Auflistungselement namens Kunden, das alle Kunde-Elemente enthält. Das Kunde-Element hat ein Attribut zum Speichern der ID sowie einige untergeordnete Felder mit Firma, Vorname, Nachname und Adresse des Kunden:

<xml version="1.0" encoding="utf-8">
<Bestellverwaltung>
   <Kunden>
     <Kunde ID="1">
       <Firma>André Minhorst Verlag</Firma>
       <Vorname>André</Vorname>
       <Nachname>Minhorst</Nachname>
       <Strasse>Borkhofer Str. 17</Strasse>
       <PLZ>47137</PLZ>
       <Ort>Duisburg</Ort>

Unterhalb des Kunde-Elements finden wir außerdem für jeden Kunden ein Auflistungselement namens Bestellungen. Dieses nimmt ein oder mehrere Bestellung-Elemente auf. Diese enthalten ebenfalls in einem Attribut namens ID einen eindeutigen Identifizierer. Darunter finden wir ein Element namens Bestelldatum mit dem Datum der Bestellung sowie ein weiteres Auflistungselement namens Bestellpositionen. Dieses enthält für jede Position ein Element des Typs Bestellposition mit dem Attribut ID.

Jede Bestellposition weist die vier Elemente Artikel, Einzelpreis, Menge und Mehrwertsteuersatz auf:

       <Bestellungen>
         <Bestellung ID="1">
           <Bestelldatum>2020-11-17T12:00:00+00:00</Bestelldatum>
           <Bestellpositionen>
             <Bestellposition ID="1">
               <Artikel>Access im Unternehmen</Artikel>
               <Einzelpreis>124</Einzelpreis>
               <Menge>1</Menge>
               <Mehrwertsteuersatz>7</Mehrwertsteuersatz>
             </Bestellposition>

Von den meisten dieser Elemente gibt es noch weitere Exemplare, die wir hier aus Platzgründen nicht explizit abbilden:

             ...
           </Bestellpositionen>
         </Bestellung>
         ...
       </Bestellungen>
     </Kunde>
     ...
   </Kunden>
</Bestellverwaltung>

Entity Framework vorbereiten

Nach dem Erstellen des WPF-Projekts mit Visual Basic fügen wir das Entity Framework hinzu. Dazu klicken Sie mit der rechten Maustaste auf das Projekt-Element im Projektmappen-Explorer und wählen aus dem Kontextmenü den Eintrag Hinzufügen|Neues Element… aus. Im Dialog Neues Element hinzufügen selektieren Sie ADO.NET Entity Data Model und nennen dieses BestellverwaltungContext.

Im folgenden Dialog Assistent für Entity Data Model wählen Sie die Option Leeres Code First-Modell aus. Dies legt die Elemente für das Entity Framework an und legt in der Datei App.config einen Connectionstring für eine Datenbank namens Bestellverwaltung.BestellverwaltungContext fest, wobei standardmäßig der Server (LocalDb)\MSSQLLocalDB verwendet wird.

Die Klasse BestellverwaltungContext.vb ergänzen wir wie folgt und definieren so die drei DbSet-Elemente, welche die Auflistungen für Kunden, Bestellungen und Bestellpositionen enthalten:

Public Class BestellverwaltungContext
     Inherits DbContext
     Public Sub New()
         MyBase.New("name=BestellverwaltungContext")
     End Sub
     Public Overridable Property Bestellpositionen() As DbSet(Of Bestellposition)
     Public Overridable Property Bestellungen() As DbSet(Of Bestellung)
     Public Overridable Property Kunden() As DbSet(Of Kunde)
End Class

Die Entitätsklasse für die Kunden hinterlegen wir wie folgt in der Klassendatei Kunde.vb in einem neuen Ordner namens DataModel. Die Klassen enthalten alle Informationen, die für das Erstellen in Form der Tabellen einer Datenbank notwendig sind. Dazu sind auch jeweils die DataAnnotations-Namespaces erforderlich:

Imports System.ComponentModel.DataAnnotations
Imports System.ComponentModel.DataAnnotations.Schema
<Table("Kunden")>
Public Partial Class Kunde
     Public Property ID As System.Int32
     <StringLength(255)>
     Public Property Firma As System.String
     <StringLength(255)>
     Public Property Vorname As System.String
     <StringLength(255)>
     Public Property Nachname As System.String
     <StringLength(255)>
     Public Property Strasse As System.String
     <StringLength(255)>
     Public Property PLZ As System.String
     <StringLength(255)>
     Public Property Ort As System.String
     Public Overridable Property Bestellungen As ICollection(Of Bestellung)
End Class

Die Klasse für die Bestellpositionen heißt Bestellung.vb und enthält die folgende Beschreibung der Felder:

Imports System.ComponentModel.DataAnnotations
Imports System.ComponentModel.DataAnnotations.Schema
<Table("Bestellungen")>
Public Partial Class Bestellung
     Public Property ID As System.Int32
     Public Property KundeID As System.Int32
     <Column(TypeName:="datetime2")>
     Public Property Bestelldatum As System.DateTime
     Public Overridable Property Bestellpositionen As ICollection(Of Bestellposition)
     Public Overridable Property Kunde As Kunde
End Class

Fehlt noch die Klasse für die Bestellpositionen, die wir Bestellposition.vb nennen:

Imports System.ComponentModel.DataAnnotations
Imports System.ComponentModel.DataAnnotations.Schema
<Table("Bestellpositionen")>
Public Partial Class Bestellposition
     Public Property ID As System.Int32
     <StringLength(255)>
     Public Property Artikel As System.String
     Public Property Einzelpreis As System.Decimal
     <StringLength(255)>
     Public Property Menge As System.String
     Public Property Mehrwertsteuersatz As System.Decimal
     Public Property BestellungID As System.Int32
     Public Overridable Property Bestellung As Bestellung
End Class

Datenbank anlegen

Zeigen Sie nun die Paket-Manager-Konsole an (Menüeintrag Ansicht|Weitere Fenster|Paket-Manager-Konsole) und geben Sie dort nacheinander die drei folgenden Befehle ein:

enable-migrations
add-migration init
update-database

Damit erstellen Sie die Datenbank auf Basis der Klassen und DbSets des Entity Data Models in der Datenbank, die in der Verbindungszeichenfolge angegeben ist.

System.XML-Namespace verfügbar machen

In der XAML-Datei MainWindow.xaml wollen wir das Einlesen mit einer Schaltfläche starten. Diese deklarieren wir wie folgt innerhalb des Grid-Elements:

<Button x:Name="btnKundenUndBestellungenInKlassen" Click="btnKundenUndBestellungenInKlassen_Click">Kunden und Bestellungen in Klassen</Button>

In der Code behind-Klasse MainWindow.xaml.vb hinterlegen wir einen Verweis auf den Namespace System.Xml:

Imports System.Xml

Klasse initialisieren per Konstruktor

Der Klasse fügen wir eine Variable namens dbContext hinzu, mit der wir auf den Datenbankkontext BestellverwaltungContext zugreifen:

Class MainWindow
     Dim dbContext As BestellverwaltungContext

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins DATENBANKENTWICKLER:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 200 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar