{"id":55000240,"date":"2020-12-01T00:00:00","date_gmt":"2020-12-23T15:46:00","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=240"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"XML_schreiben_mit_dem_Document_Object_Model","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/XML_schreiben_mit_dem_Document_Object_Model\/","title":{"rendered":"XML schreiben mit dem Document Object Model"},"content":{"rendered":"<p><b>Im Artikel &#8220;XML-Dokumente erstellen mit XmlWriter&#8221; haben wir beschrieben, wie Sie XML-Dokumente mit der XmlWriter-Klasse schreiben. Dort k&ouml;nnen Elemente nur sequenziell hinzugef&uuml;gt werden. Die Methoden des Object Document Models erlauben eine wesentlich flexiblere Vorgehensweise. Dieser Artikel zeigt, wie Sie mit dem Document Object Model neue XML-Dokumente erstellen und Elemente der verschiedenen Typen hinzuf&uuml;gen und mit Daten f&uuml;llen.<\/b><\/p>\n<p><b>Beispieldaten<\/b><\/p>\n<p>Die Beispiele aus dem ersten Teil des Artikels finden Sie im Beispielprojekt <b>XmlBeispiele <\/b>aus dem Download.<\/p>\n<p><b>Erstellen eines neuen XML-Dokuments<\/b><\/p>\n<p>Im Artikel <b>XML lesen mit dem Document Object Model <\/b>(<b>www.datenbankentwickler.net\/****<\/b>) haben Sie neue XML-Dokument-Objekte erstellt und diese mit <b>Load <\/b>oder <b>LoadXml <\/b>bef&uuml;llt. Nun wollen wir ein neues, leeres XML-Dokument erstellen und dieses speichern. Die Mindestanforderung ist dabei, dass das Dokument ein Stammelement enth&auml;lt. Um das mit VB zu realisieren, ben&ouml;tigen wir wie in den vorherigen Artikeln einen Verweis auf den Namespace <b>System.Xml<\/b>:<\/p>\n<pre>Imports System.Xml<\/pre>\n<p>Danach k&ouml;nnen wir mit der folgenden Methode ein neues <b>XmlDocument <\/b>erstellen. Bevor wir dieses speichern k&ouml;nnen, f&uuml;gen wir das Stammelement in zwei Schritten hinzu:<\/p>\n<ul>\n<li>Erstellen eines neuen Elements des Typs <b>XmlElement <\/b>mit der <b>CreateElement<\/b>-Methode des <b>XmlDocument<\/b>-Objekts und<\/li>\n<li>Hinzuf&uuml;gen dieses Elements mit der <b>AppendChild<\/b>-Methode an das XML-Dokument aus <b>objXml<\/b>.<\/li>\n<\/ul>\n<p>Danach k&ouml;nnen wir das Dokument mit <b>Save <\/b>und dem gew&uuml;nschten Dateipfad speichern:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>btnDokumentErstellenDOM_Click(sender<span style=\"color:blue;\"> As Object<\/span>, e<span style=\"color:blue;\"> As <\/span>RoutedEventArgs)\r\n     <span style=\"color:blue;\">Dim <\/span>objXml<span style=\"color:blue;\"> As <\/span>XmlDocument\r\n     <span style=\"color:blue;\">Dim <\/span>objElement<span style=\"color:blue;\"> As <\/span>XmlElement\r\n     <span style=\"color:blue;\">Dim <\/span>strDocument<span style=\"color:blue;\"> As String<\/span>\r\n     strDocument = \"C:\\...\\BestellverwaltungDOM.xml\"\r\n     objXml = <span style=\"color:blue;\">New<\/span> XmlDocument\r\n     objElement = objXml.CreateElement(\"Bestellverwaltung\")\r\n     objXml.AppendChild(objElement)\r\n     objXml.Save(strDocument)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Dokument enth&auml;lt nun schlicht folgenden Text:<\/p>\n<pre>&lt;Bestellverwaltung \/&gt;<\/pre>\n<p><b>Prolog hinzuf&uuml;gen<\/b><\/p>\n<p>F&uuml;r manche Anwendungen ist es wichtig, dass die XML-Datei einen Prolog enth&auml;lt, also folgende Zeile:<\/p>\n<pre>&lt;xml version=\"1.0\" encoding=\"utf-8\"&gt;<\/pre>\n<p>Diese nennt man auch Processing Instruction. Und genau so ein Objekt gibt es auch im Namespace <b>System.Xml<\/b>. Um dieses zu erstellen, deklarieren wir eine Variable des Typs <b>XmlProcessingInstruction <\/b>sowie eine f&uuml;r den Inhalt dieses Objekts:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objPI<span style=\"color:blue;\"> As <\/span>XmlProcessingInstruction\r\n<span style=\"color:blue;\">Dim <\/span>strPI<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Dann schreiben wir den Text in <b>strPI <\/b>und erstellen mit der Methode <b>CreateProcessingInstruction <\/b>das <b>XmlProcessingInstruction<\/b>-Element. Der erste Parameter ist der Name, der hinter <b>< <\/b>erscheinen soll, also <b>xml<\/b>, der zweite die Angabe der gew&uuml;nschten Name-Wert-Paare. Danach h&auml;ngen wir das Element wie herk&ouml;mmliche Elemente mit der <b>AppendChild<\/b>-Methode an das Dokument an und speichern es anschlie&szlig;end:<\/p>\n<pre>strPI = \"version=\"\"1.0\"\" encoding=\"\"utf-8\"\"\"\r\nobjPI = objXml.CreateProcessingInstruction(\"xml\", strPI)\r\nobjXml.AppendChild(objPI)\r\n...\r\nobjXml.Save(strDocument)<\/pre>\n<p>Das Ergebnis lautet, kombiniert mit den Anweisungen des ersten Beispiele, wie folgt:<\/p>\n<pre>&lt;xml version=\"1.0\" encoding=\"utf-8\"&gt;\r\n&lt;Bestellverwaltung \/&gt;<\/pre>\n<p>Da wir eine solche Processing Instruction allen XML-Dokumenten voranstellen, gliedern wir die notwendigen Anweisungen in eine eigene Methode aus, die wie folgt aussieht:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AddProcessingInstruction(ByVal objXml<span style=\"color:blue;\"> As <\/span>XmlDocument)\r\n     <span style=\"color:blue;\">Dim <\/span>objPI<span style=\"color:blue;\"> As <\/span>XmlProcessingInstruction\r\n     <span style=\"color:blue;\">Dim <\/span>strPI<span style=\"color:blue;\"> As String<\/span>\r\n     strPI = \"version=\"\"1.0\"\" encoding=\"\"utf-8\"\"\"\r\n     objPI = objXml.CreateProcessingInstruction(\"xml\", strPI)\r\n     objXml.AppendChild(objPI)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Den Aufruf k&ouml;nnen wir dann so in die eigentliche Methode zum Erstellen des XML-Dokuments einstreuen:<\/p>\n<pre>AddProcessingInstruction(objXml)<\/pre>\n<p><b>Unterelemente hinzuf&uuml;gen<\/b><\/p>\n<p>Unser XML-Dokument besteht nun gerade mal aus der Processing Instruction und dem Stammelement <b>Bestellverwaltung<\/b>. Weitere Elemente m&uuml;ssen wir zwingend dem Stammelement unterordnen. Dieses haben wir aber bereits mit <b>objElement <\/b>referenziert, sodass wir eigentlich direkt loslegen k&ouml;nnen. Allerdings machen wir uns direkt an dieser Stelle Gedanken &uuml;ber die Benennung der <b>XmlElement<\/b>-Variablen, denn wir werden ja vielleicht noch weitere verschachtelte Elemente wie Kunden, Bestellungen und Bestellpositionen einf&uuml;gen wollen und wir ben&ouml;tigen f&uuml;r alle zumindest eine Objektvariable je Typ. Also &auml;ndern wir den Namen der Objektvariablen f&uuml;r das Stammelement in <b>objBestellverwaltung<\/b>. Die folgenden Elemente wollen wir dann <b>objKunden<\/b>, <b>objKunde<\/b>, <b>objBestellungen<\/b>, <b>objBestellung <\/b>und so weiter nennen. Als Erstes wollen wir nur das Unterelement <b>Kunden <\/b>hinzuf&uuml;gen. Dazu legen wir die Variable <b>objKunden <\/b>mit dem Typ <b>XmlElement <\/b>an.<\/p>\n<p>Dieser weisen wir dann das mit der <b>CreateElement <\/b>von <b>objXml <\/b>erstellte Objekt mit dem Namen <b>Kunden <\/b>zu. Allerdings h&auml;ngen wir das <b>Kunden<\/b>-Element nicht an das XML-Dokument aus <b>objXml <\/b>an, sondern an das Element aus <b>objBestellverwaltung<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>btnDokumentErstellenDOM_Unterelemente_Click(sender<span style=\"color:blue;\"> As Object<\/span>, e<span style=\"color:blue;\"> As <\/span>RoutedEventArgs)\r\n     ...\r\n     <span style=\"color:blue;\">Dim <\/span>objKunden<span style=\"color:blue;\"> As <\/span>XmlElement\r\n     ...\r\n     objBestellverwaltung = objXml.CreateElement(\"Bestellverwaltung\")\r\n     objXml.AppendChild(objBestellverwaltung)\r\n     objKunden = objXml.CreateElement(\"Kunden\")\r\n     objBestellverwaltung.AppendChild(objKunden)\r\n     objXml.Save(strDocument)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Ergebnis sieht dann genau wie gew&uuml;nscht aus:<\/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;\/Bestellverwaltung&gt;<\/pre>\n<p><b>Elemente mit Werten hinzuf&uuml;gen <\/b><\/p>\n<p>Nun n&auml;hern wir uns den Elementen, die selbst Werte enthalten, also zum Beispiel das folgende:<\/p>\n<pre>   &lt;Kunden&gt;\r\n     &lt;Kunde&gt;\r\n       &lt;Firma&gt;Andr&eacute; Minhorst Verlag&lt;\/Firma&gt;\r\n     &lt;\/Kunde&gt;\r\n   &lt;\/Kunden&gt;<\/pre>\n<p>Texte wie hier innerhalb des Elements <b>Firma <\/b>sind Elemente des Typs <b>XmlText<\/b>. Neben den &uuml;brigen neu hinzugekommenen Elementen deklarieren wir dieses entsprechend. Danach legen wir unterhalb des Elements aus <b>objKunden <\/b>weitere neue Elemente namens <b>objKunde <\/b>und <b>objFirma <\/b>an, beide des Typs <b>XmlElement<\/b>. Schlie&szlig;lich erstellen wir ein neues Element des Typs <b>XmlText <\/b>und weisen diesem mit dem Parameter <b>text <\/b>den gew&uuml;nschten Inhalt zu. Dieses Objekt h&auml;ngen wir an <b>objFirma <\/b>an:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objKunde<span style=\"color:blue;\"> As <\/span>XmlElement\r\n<span style=\"color:blue;\">Dim <\/span>objFirma<span style=\"color:blue;\"> As <\/span>XmlElement\r\n<span style=\"color:blue;\">Dim <\/span>objText<span style=\"color:blue;\"> As <\/span>XmlText\r\n...\r\nobjKunde = objXml.CreateElement(\"Kunde\")\r\nobjKunden.AppendChild(objKunde)\r\nobjFirma = objXml.CreateElement(\"Firma\")\r\nobjKunde.AppendChild(objFirma)\r\nobjText = objXml.CreateTextNode(\"Andr&eacute; Minhorst Verlag\")\r\nobjFirma.AppendChild(objText)\r\nobjXml.Save(strDocument)<\/pre>\n<p>Damit h&auml;tten wir die Werkzeuge zum Zusammenstellen der Grundstruktur vollst&auml;ndig und k&ouml;nnen uns anderen Elementen zuwenden.<\/p>\n<p><b>Attribute hinzuf&uuml;gen<\/b><\/p>\n<p>Die Elemente <b>Kunde<\/b>, <b>Bestellung <\/b>und <b>Bestellposition <\/b>sollen jeweils um ein Attribut namens <b>ID <\/b>erg&auml;nzt werden:<\/p>\n<pre>&lt;Kunde ID=\"123\"&gt;<\/pre>\n<p>Dazu deklarieren wir eine Variable des Typs <b>XmlAttribute<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objID<span style=\"color:blue;\"> As <\/span>XmlAttribute<\/pre>\n<p>Nach dem Erstellen des Elements, das wir mit dem Attribut ausstatten wollen, erzeugen wir das <b>XmlAttribute<\/b>-Objekt. Dann weisen wir diesem &uuml;ber das Attribut <b>Value <\/b>den gew&uuml;nschten Wert zu und h&auml;ngen das Attribut &uuml;ber die Methode <b>Append <\/b>der Auflistung <b>Attributes <\/b>an das <b>XmlElement<\/b>-Objekt an. Schlie&szlig;lich f&uuml;gen wir das <b>XmlElement<\/b>-Objekt zum &uuml;bergeordneten Objekt zu:<\/p>\n<pre>objKunde = objXml.CreateElement(\"Kunde\")\r\nobjID = objXml.CreateAttribute(\"ID\")\r\nobjID.Value = \"123\"\r\nobjKunde.Attributes.Append(objID)\r\nobjKunden.AppendChild(objKunde)<\/pre>\n<p>Sie k&ouml;nnen das Attribut allerdings auch erst nach dem Anh&auml;ngen des <b>XmlElement<\/b>-Objekts an das &uuml;bergeordnete Element hinzuf&uuml;gen.<\/p>\n<p><b>CDATA-Block hinzuf&uuml;gen<\/b><\/p>\n<p>Mit der Methode <b>CreateCDataSection<\/b> erstellen Sie ein Element mit einem <b>CDATA<\/b>-Block. Den Inhalt des <b>CDATA<\/b>-Blocks &uuml;bergeben Sie als Parameter der Methode <b>CreateCDataSection<\/b>. Heraus kommt ein Objekt des Typs <b>XmlCDataSection<\/b>, das Sie wie gewohnt mit der <b>AppendChild<\/b>-Methode an das &uuml;bergeordnete Element anf&uuml;gen:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objCData<span style=\"color:blue;\"> As <\/span>XmlCDataSection\r\n...\r\nobjCData = objXml.CreateCDataSection(\"Dies ist ein CDATA-Block mit Sonderzeichen wie &lt;&gt;&.\")\r\nobjBestellverwaltung.AppendChild(objCData)<\/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\/55000240\/\">\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\/55000240?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\/55000240\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"2c6d4a5d32\"\/>\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>Im Artikel &#8220;XML-Dokumente erstellen mit XmlWriter&#8221; haben wir beschrieben, wie Sie XML-Dokumente mit der XmlWriter-Klasse schreiben. Dort k&ouml;nnen Elemente nur sequenziell hinzugef&uuml;gt werden. Die Methoden des Object Document Models erlauben eine wesentlich flexiblere Vorgehensweise. Dieser Artikel zeigt, wie Sie mit dem Document Object Model neue XML-Dokumente erstellen und Elemente der verschiedenen Typen hinzuf&uuml;gen und mit Daten f&uuml;llen.<\/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,66062020,44000012,44000026,44000022],"tags":[],"yst_prominent_words":[],"class_list":["post-55000240","post","type-post","status-publish","format-standard","hentry","category-662020","category-66062020","category-Interaktiv","category-Outlook_programmieren","category-Von_Access_zu_NET"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000240","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=55000240"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000240\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000240"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000240"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000240"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000240"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}