{"id":55000234,"date":"2020-08-01T00:00:00","date_gmt":"2020-11-26T14:11:45","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=234"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Bestellungen_per_XmlReader_einlesen","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Bestellungen_per_XmlReader_einlesen\/","title":{"rendered":"Bestellungen per XmlReader einlesen"},"content":{"rendered":"<p><b>Mit dem XmlReader durchlaufen Sie ein XML-Dokument Element f&uuml;r Element. Da dies recht unflexibel ist, m&uuml;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.<\/b><\/p>\n<p><b>Zu importierendes XML-Dokument<\/b><\/p>\n<p>Das XML-Dokument, dessen Daten wir importieren wollen, hat ein Stammelement namens Bestellverwaltung. Darunter finden wir ein Auflistungselement namens <b>Kunden<\/b>, das alle <b>Kunde<\/b>-Elemente enth&auml;lt. Das <b>Kunde<\/b>-Element hat ein Attribut zum Speichern der <b>ID <\/b>sowie einige untergeordnete Felder mit Firma, Vorname, Nachname und Adresse des Kunden:<\/p>\n<pre>&lt;xml version=\"1.0\" encoding=\"utf-8\"&gt;\r\n&lt;Bestellverwaltung&gt;\r\n   &lt;Kunden&gt;\r\n     &lt;Kunde ID=\"1\"&gt;\r\n       &lt;Firma&gt;Andr&eacute; Minhorst Verlag&lt;\/Firma&gt;\r\n       &lt;Vorname&gt;Andr&eacute;&lt;\/Vorname&gt;\r\n       &lt;Nachname&gt;Minhorst&lt;\/Nachname&gt;\r\n       &lt;Strasse&gt;Borkhofer Str. 17&lt;\/Strasse&gt;\r\n       &lt;PLZ&gt;47137&lt;\/PLZ&gt;\r\n       &lt;Ort&gt;Duisburg&lt;\/Ort&gt;<\/pre>\n<p>Unterhalb des <b>Kunde<\/b>-Elements finden wir au&szlig;erdem f&uuml;r jeden Kunden ein Auflistungselement namens <b>Bestellungen<\/b>. Dieses nimmt ein oder mehrere <b>Bestellung<\/b>-Elemente auf. Diese enthalten ebenfalls in einem Attribut namens <b>ID <\/b>einen eindeutigen Identifizierer. Darunter finden wir ein Element namens <b>Bestelldatum <\/b>mit dem Datum der Bestellung sowie ein weiteres Auflistungselement namens <b>Bestellpositionen<\/b>. Dieses enth&auml;lt f&uuml;r jede Position ein Element des Typs <b>Bestellposition <\/b>mit dem Attribut <b>ID<\/b>.<\/p>\n<p>Jede Bestellposition weist die vier Elemente <b>Artikel<\/b>, <b>Einzelpreis<\/b>, <b>Menge <\/b>und <b>Mehrwertsteuersatz <\/b>auf:<\/p>\n<pre>       &lt;Bestellungen&gt;\r\n         &lt;Bestellung ID=\"1\"&gt;\r\n           &lt;Bestelldatum&gt;2020-11-17T12:00:00+00:00&lt;\/Bestelldatum&gt;\r\n           &lt;Bestellpositionen&gt;\r\n             &lt;Bestellposition ID=\"1\"&gt;\r\n               &lt;Artikel&gt;Access im Unternehmen&lt;\/Artikel&gt;\r\n               &lt;Einzelpreis&gt;124&lt;\/Einzelpreis&gt;\r\n               &lt;Menge&gt;1&lt;\/Menge&gt;\r\n               &lt;Mehrwertsteuersatz&gt;7&lt;\/Mehrwertsteuersatz&gt;\r\n             &lt;\/Bestellposition&gt;<\/pre>\n<p>Von den meisten dieser Elemente gibt es noch weitere Exemplare, die wir hier aus Platzgr&uuml;nden nicht explizit abbilden:<\/p>\n<pre>             ...\r\n           &lt;\/Bestellpositionen&gt;\r\n         &lt;\/Bestellung&gt;\r\n         ...\r\n       &lt;\/Bestellungen&gt;\r\n     &lt;\/Kunde&gt;\r\n     ...\r\n   &lt;\/Kunden&gt;\r\n&lt;\/Bestellverwaltung&gt;<\/pre>\n<p><b>Entity Framework vorbereiten<\/b><\/p>\n<p>Nach dem Erstellen des WPF-Projekts mit Visual Basic f&uuml;gen wir das Entity Framework hinzu. Dazu klicken Sie mit der rechten Maustaste auf das Projekt-Element im Projektmappen-Explorer und w&auml;hlen aus dem Kontextmen&uuml; den Eintrag <b>Hinzuf&uuml;gen|Neues Element&#8230; <\/b>aus. Im Dialog <b>Neues Element hinzuf&uuml;gen <\/b>selektieren Sie <b>ADO.NET Entity Data Model <\/b>und nennen dieses <b>BestellverwaltungContext<\/b>.<\/p>\n<p>Im folgenden Dialog <b>Assistent f&uuml;r Entity Data Model <\/b>w&auml;hlen Sie die Option <b>Leeres Code First-Modell <\/b>aus. Dies legt die Elemente f&uuml;r das Entity Framework an und legt in der Datei <b>App.config <\/b>einen Connectionstring f&uuml;r eine Datenbank namens <b>Bestellverwaltung.BestellverwaltungContext <\/b>fest, wobei standardm&auml;&szlig;ig der Server <b>(LocalDb)\\MSSQLLocalDB <\/b>verwendet wird.<\/p>\n<p>Die Klasse <b>BestellverwaltungContext.vb <\/b>erg&auml;nzen wir wie folgt und definieren so die drei DbSet-Elemente, welche die Auflistungen f&uuml;r Kunden, Bestellungen und Bestellpositionen enthalten:<\/p>\n<pre><span style=\"color:blue;\">Public Class<\/span> BestellverwaltungContext\r\n     Inherits DbContext\r\n     <span style=\"color:blue;\">Public <\/span>Sub New()\r\n         MyBase.New(\"name=BestellverwaltungContext\")\r\n     End Sub\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Bestellpositionen()<span style=\"color:blue;\"> As <\/span>DbSet(Of Bestellposition)\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Bestellungen()<span style=\"color:blue;\"> As <\/span>DbSet(Of Bestellung)\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Kunden()<span style=\"color:blue;\"> As <\/span>DbSet(Of Kunde)\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p>Die Entit&auml;tsklasse f&uuml;r die Kunden hinterlegen wir wie folgt in der Klassendatei <b>Kunde.vb <\/b>in einem neuen Ordner namens <b>DataModel<\/b>. Die Klassen enthalten alle Informationen, die f&uuml;r das Erstellen in Form der Tabellen einer Datenbank notwendig sind. Dazu sind auch jeweils die <b>DataAnnotations<\/b>-Namespaces erforderlich:<\/p>\n<pre>Imports System.ComponentModel.DataAnnotations\r\nImports System.ComponentModel.DataAnnotations.Schema\r\n&lt;Table(\"Kunden\")&gt;\r\n<span style=\"color:blue;\">Public <\/span>Partial Class Kunde\r\n     <span style=\"color:blue;\">Public <\/span>Property ID<span style=\"color:blue;\"> As <\/span>System.Int32\r\n     &lt;StringLength(255)&gt;\r\n     <span style=\"color:blue;\">Public <\/span>Property Firma<span style=\"color:blue;\"> As <\/span>System.String\r\n     &lt;StringLength(255)&gt;\r\n     <span style=\"color:blue;\">Public <\/span>Property Vorname<span style=\"color:blue;\"> As <\/span>System.String\r\n     &lt;StringLength(255)&gt;\r\n     <span style=\"color:blue;\">Public <\/span>Property Nachname<span style=\"color:blue;\"> As <\/span>System.String\r\n     &lt;StringLength(255)&gt;\r\n     <span style=\"color:blue;\">Public <\/span>Property Strasse<span style=\"color:blue;\"> As <\/span>System.String\r\n     &lt;StringLength(255)&gt;\r\n     <span style=\"color:blue;\">Public <\/span>Property PLZ<span style=\"color:blue;\"> As <\/span>System.String\r\n     &lt;StringLength(255)&gt;\r\n     <span style=\"color:blue;\">Public <\/span>Property Ort<span style=\"color:blue;\"> As <\/span>System.String\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Bestellungen<span style=\"color:blue;\"> As <\/span>ICollection(Of Bestellung)\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p>Die Klasse f&uuml;r die Bestellpositionen hei&szlig;t <b>Bestellung.vb <\/b>und enth&auml;lt die folgende Beschreibung der Felder:<\/p>\n<pre>Imports System.ComponentModel.DataAnnotations\r\nImports System.ComponentModel.DataAnnotations.Schema\r\n&lt;Table(\"Bestellungen\")&gt;\r\n<span style=\"color:blue;\">Public <\/span>Partial Class Bestellung\r\n     <span style=\"color:blue;\">Public <\/span>Property ID<span style=\"color:blue;\"> As <\/span>System.Int32\r\n     <span style=\"color:blue;\">Public <\/span>Property KundeID<span style=\"color:blue;\"> As <\/span>System.Int32\r\n     &lt;Column(TypeName:=\"datetime2\")&gt;\r\n     <span style=\"color:blue;\">Public <\/span>Property Bestelldatum<span style=\"color:blue;\"> As <\/span>System.DateTime\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Bestellpositionen<span style=\"color:blue;\"> As <\/span>ICollection(Of Bestellposition)\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Kunde<span style=\"color:blue;\"> As <\/span>Kunde\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p>Fehlt noch die Klasse f&uuml;r die Bestellpositionen, die wir <b>Bestellposition.vb <\/b>nennen:<\/p>\n<pre>Imports System.ComponentModel.DataAnnotations\r\nImports System.ComponentModel.DataAnnotations.Schema\r\n&lt;Table(\"Bestellpositionen\")&gt;\r\n<span style=\"color:blue;\">Public <\/span>Partial Class Bestellposition\r\n     <span style=\"color:blue;\">Public <\/span>Property ID<span style=\"color:blue;\"> As <\/span>System.Int32\r\n     &lt;StringLength(255)&gt;\r\n     <span style=\"color:blue;\">Public <\/span>Property Artikel<span style=\"color:blue;\"> As <\/span>System.String\r\n     <span style=\"color:blue;\">Public <\/span>Property Einzelpreis<span style=\"color:blue;\"> As <\/span>System.Decimal\r\n     &lt;StringLength(255)&gt;\r\n     <span style=\"color:blue;\">Public <\/span>Property Menge<span style=\"color:blue;\"> As <\/span>System.String\r\n     <span style=\"color:blue;\">Public <\/span>Property Mehrwertsteuersatz<span style=\"color:blue;\"> As <\/span>System.Decimal\r\n     <span style=\"color:blue;\">Public <\/span>Property BestellungID<span style=\"color:blue;\"> As <\/span>System.Int32\r\n     <span style=\"color:blue;\">Public <\/span>Overridable Property Bestellung<span style=\"color:blue;\"> As <\/span>Bestellung\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p><b>Datenbank anlegen<\/b><\/p>\n<p>Zeigen Sie nun die Paket-Manager-Konsole an (Men&uuml;eintrag <b>Ansicht|Weitere Fenster|Paket-Manager-Konsole<\/b>) und geben Sie dort nacheinander die drei folgenden Befehle ein:<\/p>\n<pre>enable-migrations\r\nadd-migration init\r\nupdate-database<\/pre>\n<p>Damit erstellen Sie die Datenbank auf Basis der Klassen und DbSets des Entity Data Models in der Datenbank, die in der Verbindungszeichenfolge angegeben ist.<\/p>\n<p><b>System.XML-Namespace verf&uuml;gbar machen<\/b><\/p>\n<p>In der XAML-Datei <b>MainWindow.xaml <\/b>wollen wir das Einlesen mit einer Schaltfl&auml;che starten. Diese deklarieren wir wie folgt innerhalb des <b>Grid<\/b>-Elements:<\/p>\n<pre>&lt;Button x:Name=\"btnKundenUndBestellungenInKlassen\" Click=\"btnKundenUndBestellungenInKlassen_Click\"&gt;Kunden und Bestellungen in Klassen&lt;\/Button&gt;<\/pre>\n<p>In der Code behind-Klasse <b>MainWindow.xaml.vb <\/b>hinterlegen wir einen Verweis auf den Namespace <b>System.Xml<\/b>:<\/p>\n<pre>Imports System.Xml<\/pre>\n<p><b>Klasse initialisieren per Konstruktor<\/b><\/p>\n<p>Der Klasse f&uuml;gen wir eine Variable namens <b>dbContext <\/b>hinzu, mit der wir auf den Datenbankkontext <b>BestellverwaltungContext <\/b>zugreifen:<\/p>\n<pre><span style=\"color:blue;\">Class<\/span> MainWindow\r\n     <span style=\"color:blue;\">Dim <\/span>dbContext<span style=\"color:blue;\"> As <\/span>BestellverwaltungContext<\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000234\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000234?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000234\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"2987d086e8\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mit dem XmlReader durchlaufen Sie ein XML-Dokument Element f&uuml;r Element. Da dies recht unflexibel ist, m&uuml;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.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662020,66042020,44000012,44000025,44000017],"tags":[],"yst_prominent_words":[],"class_list":["post-55000234","post","type-post","status-publish","format-standard","hentry","category-662020","category-66042020","category-Interaktiv","category-VBAProgrammierung","category-WebApps_Razor_Pages"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000234","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000234"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000234\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000234"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000234"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000234"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000234"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}