{"id":55000801,"date":"2011-10-01T00:00:00","date_gmt":"2020-05-22T21:58:30","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=801"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"XMLCodeBuilder_","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/XMLCodeBuilder_\/","title":{"rendered":"XML-Code-Builder"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/959c6f030b05449ca3537e4a3f7b691c\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Ein XML-Code-Builder &#8211; was soll das denn sein Nun: Stellen Sie sich einfach vor, Ihr Kunde liefert Ihnen eine Datenbank und ein XML-Dokument und m&ouml;chte, dass Sie ihm den Code liefern, mit dem er ein so aufgebautes XML-Dokument mit Daten aus der Datenbank f&uuml;llen kann. Kein Problem, sagen Sie &#8211; es ist zwar etwas Flei&szlig;arbeit, aber das bekommen Sie schon hin. Ach: Ist Flei&szlig;arbeit nicht das erkl&auml;rte Feindbild eines Access-Entwicklers Genau! Und deshalb liefert dieser Beitrag Ihnen die Werkzeuge, um das Grundger&uuml;st des zu erstellenden Codes aufzubauen.<\/b><\/p>\n<p>Mir ist das schon einige Male untergekommen: Ein Kunde m&ouml;chte Daten aus seiner Datenbank in das XML-Format &uuml;bertragen, weil dies die einzige M&ouml;glichkeit ist, die Daten an eine weitere Anwendung, einen Webservice und so weiter zu &uuml;bergeben. Bereits nach dem Zusammenstellen der ersten paar Zeilen Code war klar: Das l&auml;sst sich automatisieren, zumindest f&uuml;r das Grundger&uuml;st. Dass da noch ein wenig Handarbeit n&ouml;tig ist, war klar, aber zumindest das Kopieren und Einf&uuml;gen bestehender Codesegmente und das Anpassen an die jeweils zu schreibenden XML-Elemente auf Basis der Tabellenfelder ist erstens zu m&uuml;hsam und zweitens zu fehleranf&auml;llig.<\/p>\n<p>Also toben wir uns lieber an ein paar schicken VBA-Routinen aus, die uns den Gro&szlig;teil der Arbeit abnehmen. Was ist das Ziel der L&ouml;sung, die wir in diesem Beitrag vorstellen Stellen Sie sich vor, Sie sollten aus der S&uuml;dsturm-Datenbank heraus einen Export fahren, der etwa in einen Onlineshop importiert werden soll. Das XML-Dokument zum &Uuml;bertragen der Artikeldaten zum Onlineshop soll dann beispielsweise so aussehen, wie ein Beispieldokument verr&auml;t:<\/p>\n<pre>&lt;xml version=&quot;1.0&quot;&gt;\r\n&lt;Katalog&gt;\r\n    &lt;Datum&gt;11.07.2011&lt;\/Datum&gt;\r\n    &lt;Zeit&gt;12:29:49&lt;\/Zeit&gt;\r\n    &lt;Artikelliste&gt;\r\n        &lt;Artikel ID=&quot;1&quot;&gt;\r\n            &lt;Artikelname&gt;Artikel 1&lt;\/Artikelname&gt;\r\n            &lt;Waehrung&gt;EUR&lt;\/Waehrung&gt;\r\n            &lt;Einzelpreis&gt;10,00&lt;\/Einzelpreis&gt;\r\n        &lt;\/Artikel&gt;\r\n        &lt;Artikel ID=&quot;2&quot;&gt;\r\n            &lt;Artikelname&gt;Artikel 2&lt;\/Artikelname&gt;\r\n            &lt;Waehrung&gt;EUR&lt;\/Waehrung&gt;\r\n            &lt;Einzelpreis&gt;20,00&lt;\/Einzelpreis&gt;\r\n        &lt;\/Artikel&gt;\r\n        ...\r\n    &lt;\/Artikelliste&gt;\r\n&lt;\/Katalog&gt;<\/pre>\n<p>Sie m&uuml;ssen nun Code schreiben, der erstens die Basiselemente wie die XML-Auszeichnung und die Elemente <b>Katalog<\/b>, <b>Datum<\/b>, <b>Zeit <\/b>und <b>Artikelliste<\/b> erzeugt. Danach folgt eine Schleife &uuml;ber alle Eintr&auml;ge der Tabelle <b>tblArtikel<\/b>, in der f&uuml;r jeden Artikel ein <b>Artikel<\/b>-Element sowie die darunter befindlichen Elemente angelegt werden.<\/p>\n<p>Im Detail w&uuml;rde bereits zum Erstellen dieses einfachen XML-Dokuments die Prozedur aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-43-anchor\">Listing 1<\/a><\/span> n&ouml;tig sein. Die Prozedur erstellt zun&auml;chst die Kopfdaten, danach folgen die Elemente <b>Katalog <\/b>und <b>Artikelliste <\/b>sowie in einer <b>Do While<\/b>-Schleife &uuml;ber alle Artikel die Elemente <b>Artikel <\/b>(mit dem Attribut <b>ID<\/b>), <b>Artikelname<\/b>, <b>Waehrung <\/b>und <b>Einzelpreis<\/b>. Um die Struktur abzubilden, legt die Prozedur jeweils die &uuml;bergeordneten Elemente an, speichert einen Verweis auf diese Elemente in einer entsprechenden Objektvariablen und verwendet diese dann, um weitere Elemente unterzuordnen. Das bedeutet, dass Sie prinzipiell f&uuml;r jeden Elementtyp eine Objektvariable erzeugen m&uuml;ssen, in deren Kontext dann die untergeordneten Elemente erstellt werden k&ouml;nnen.<\/p>\n<p class=\"listingueberschrift\">Listing 1: Zusammenstellen eines XML-Dokuments mit Artikeldaten<\/p>\n<pre>Public Sub Katalog()\r\n    Dim db As DAO.Database\r\n    Dim rst As DAO.Recordset\r\n    Dim objXML As MSXML2.DOMDocument\r\n    Dim objPI As MSXML2.IXMLDOMProcessingInstruction\r\n    Dim objKatalog As MSXML2.IXMLDOMElement\r\n    Dim objDatum As MSXML2.IXMLDOMElement\r\n    Dim objZeit As MSXML2.IXMLDOMElement\r\n    Dim objArtikelliste As MSXML2.IXMLDOMElement\r\n    Dim objArtikel As MSXML2.IXMLDOMElement\r\n    Dim objArtikelname As MSXML2.IXMLDOMElement\r\n    Dim objWaehrung As MSXML2.IXMLDOMElement\r\n    Dim objEinzelpreis As MSXML2.IXMLDOMElement\r\n    Set db = CurrentDb\r\n    Set rst = db.OpenRecordset(&quot;SELECT * FROM tblArtikel&quot;, dbOpenDynaset)\r\n    Set objXML = New MSXML2.DOMDocument\r\n    Set objPI = objXML.createProcessingInstruction(&quot;xml&quot;, &quot;version=&quot;&quot;1.0&quot;&quot; encoding=&quot;&quot;utf-8&quot;&quot;&quot;)\r\n    objXML.appendChild objPI\r\n    Set objKatalog = objXML.createElement(&quot;Katalog&quot;)\r\n    objXML.appendChild objKatalog\r\n    Set objDatum = objXML.createElement(&quot;Datum&quot;)\r\n    objKatalog.appendChild objDatum\r\n    objDatum.Text = Date\r\n    Set objZeit = objXML.createElement(&quot;Zeit&quot;)\r\n    objKatalog.appendChild objZeit\r\n    objZeit.Text = Time\r\n    Set objArtikelliste = objXML.createElement(&quot;Artikelliste&quot;)\r\n    objKatalog.appendChild objArtikelliste\r\n    Do While Not rst.EOF\r\n         Set objArtikel = objXML.createElement(&quot;Artikel&quot;)\r\n        objArtikelliste.appendChild objArtikel\r\n        objArtikel.setAttribute &quot;ID&quot;, rst!ArtikelID\r\n        Set objArtikelname = objXML.createElement(&quot;Artikelname&quot;)\r\n        objArtikel.appendChild objArtikelname\r\n        objArtikelname.Text = rst!Artikelname\r\n        Set objWaehrung = objXML.createElement(&quot;Waehrung&quot;)\r\n        objArtikel.appendChild objWaehrung\r\n        objWaehrung.Text = &quot;EUR&quot;\r\n        Set objEinzelpreis = objXML.createElement(&quot;Einzelpreis&quot;)\r\n        objArtikel.appendChild objEinzelpreis\r\n        objEinzelpreis.Text = rst!Einzelpreis\r\n        rst.MoveNext\r\n    Loop\r\n    Debug.Print FormatXML(objXML.XML)\r\nEnd Sub<\/pre>\n<p><b>Verweis auf die XML-Bibliothek<\/b><\/p>\n<p>Damit Sie die notwendigen Routinen zum Erstellen und Auslesen der XML-Dokumente unter Zuhilfenahme von IntelliSense erstellen k&ouml;nnen, brauchen Sie einen Verweis auf die Bibliothek <b>Microsoft XML, vx.0<\/b>. Diesen f&uuml;gen Sie &uuml;ber den <b>Verweise<\/b>-Dialog hinzu, den Sie mit dem Men&uuml;eintrag <b>Extras|Verweise <\/b>&ouml;ffnen.<\/p>\n<p><b>Vereinfachung der Code-Erstellung<\/b><\/p>\n<p>Der erste Schritt auf dem Weg zu einer massiven Vereinfachung der Erstellung von Code zum Produzieren von XML-Dokumenten sind Routinen, welche die immer wiederkehrenden Befehle kapseln.<\/p>\n<p><b>Verarbeitungsanweisung hinzuf&uuml;gen<\/b><\/p>\n<p>Ein XML-Dokument enth&auml;lt in der Regel die folgende Zeile:<\/p>\n<pre>&lt;xml version=&quot;1.0&quot;&gt;<\/pre>\n<p>Um diese Zeile zu einem jungfr&auml;ulichen XML-Dokument hinzuzuf&uuml;gen, das mit einer entsprechenden <b>DOMDocument<\/b>-Variablen referenziert wird, verwenden Sie die Prozedur aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-56-anchor\">Listing 2<\/a><\/span>. Die Prozedur f&uuml;gt der mit dem als Parameter &uuml;bergebenen XML-Dokument die gew&uuml;nschte Zeile hinzu. Um ein Dokument nur mit der Verarbeitungsanweisung auszustatten, ben&ouml;tigen Sie nun nur noch die folgende kleine Prozedur:<\/p>\n<p class=\"listingueberschrift\">Listing 2: Erstellen der Verarbeitungsanweisung eines XML-Dokuments<\/p>\n<pre>Public Sub AddPI(objXML As MSXML2.DOMDocument)\r\n    Dim objPI As MSXML2.IXMLDOMProcessingInstruction\r\n    Set objPI = objXML.createProcessingInstruction(&quot;xml&quot;, &quot;version=&quot;&quot;1.0&quot;&quot; encoding=&quot;&quot;utf-8&quot;&quot;&quot;)\r\n    objXML.appendChild objPI\r\nEnd Sub\r\nPublic Sub DokumentMitPI()\r\n    Dim objXML As MSXML2.DOMDocument\r\n    Set objXML = New MSXML2.DOMDocument\r\n    AddPI objXML\r\n    Debug.Print objXML.XML\r\nEnd Sub<\/pre>\n<p>Diese Prozedur erstellt das XML-Dokument, f&uuml;gt die Verarbeitungsanweisung hinzu und gibt das Dokument im Direktfenster aus.<\/p>\n<p><b>Elemente hinzuf&uuml;gen<\/b><\/p>\n<p>Nun folgen die eigentlichen Elemente des XML-Dokuments. Zum Hinzuf&uuml;gen eines einfachen Elements ben&ouml;tigen Sie eigentlich die folgenden beiden Anweisungen:<\/p>\n<pre>Set objKatalog = objXML.createElement(&quot;Katalog&quot;)\r\nobjXML.appendChild objKatalog<\/pre>\n<p>Damit f&uuml;gen Sie ein Element mit dem Namen <b>Katalog <\/b>als Root-Element hinzu, das jedoch noch keinen Inhalt besitzt:<\/p>\n<pre>&lt;xml version=&quot;1.0&quot;&gt;\r\n&lt;Katalog\/&gt;<\/pre>\n<p>Um diesem Element das Element <b>Artikelliste <\/b>unterzuordnen, legen Sie das Element im Kontext von <b>objXML <\/b>an, h&auml;ngen es aber mit <b>appendChild <\/b>an das Element <b>objKatalog <\/b>an:<\/p>\n<pre>Set objArtikelliste = objXML.\r\ncreateElement(&quot;Artikelliste&quot;)\r\nobjKatalog.appendChild objArtikelliste<\/pre>\n<p>Das Result sieht dann so aus:<\/p>\n<pre>&lt;xml version=&quot;1.0&quot;&gt;\r\n&lt;Katalog&gt;&lt;Artikelliste\/&gt;&lt;\/Katalog&gt;<\/pre>\n<p>Das Anh&auml;ngen der <b>Artikel<\/b>-Elemente geschieht genau so, beim Element <b>Artikelname <\/b>kommt jedoch noch ein Inhalt hinzu &#8211; genau genommen ein Text:<\/p>\n<pre>Set objArtikelname = objXML. createElement(&quot;Artikelname&quot;)\r\nobjArtikel.appendChild objArtikelname\r\nobjArtikelname.Text = rst!Artikelname<\/pre>\n<p>Dazu speichern Sie wiederum den Verweis auf das Element und verwenden dann dessen <b>Text<\/b>-Eigenschaft, um den Inhalt hinzuzuf&uuml;gen. Wie w&auml;re es, diese Objekte &#8211; egal, ob mit oder ohne Text &#8211; s&auml;mtlich mit Einzeilern anzulegen Schauen Sie sich einmal die Prozedur aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-44-anchor\">Listing 3<\/a><\/span> an. Diese erwartet drei Parameter:<\/p>\n<p class=\"listingueberschrift\">Listing 3: Erstellung der Elemente des XML-Dokuments<\/p>\n<pre>Public Function CreateSubElement(objElement As Object, strElementname As String, Optional strText As String) As MSXML2.IXMLDOMElement\r\n    Dim strTypename As String\r\n    Dim objDocument As MSXML2.DOMDocument\r\n    Dim objXMLElement As MSXML2.IXMLDOMElement\r\n    strTypename = TypeName(objElement)\r\n    Select Case strTypename\r\n        Case &quot;DOMDocument&quot;\r\n            Set objXMLElement = objElement.createElement(strElementname)\r\n            objElement.appendChild objXMLElement\r\n        Case &quot;IXMLDOMElement&quot;\r\n            Set objDocument = objElement.ownerDocument\r\n            Set objXMLElement = objDocument.createElement(strElementname)\r\n            objElement.appendChild objXMLElement\r\n    End Select\r\n    If Len(strText) &gt; 0 Then\r\n        objXMLElement.Text = strText\r\n    End If\r\n    Set CreateSubElement = objXMLElement\r\nEnd Function<\/pre>\n<ul>\n<li class=\"aufz-hlung\"><b>objElement<\/b>: Verweis auf das Element, unterhalb dessen das neue Element angelegt werden soll<\/li>\n<li class=\"aufz-hlung\"><b>strElementname<\/b>: Name des neuen Elements, also beispielsweise Katalog, <b>Artikelliste <\/b>oder <b>Artikel<\/b><\/li>\n<li class=\"aufz-hlung\"><b>strText<\/b>: Text, den das Element enthalten soll, also beispielsweise Artikelname, W&auml;hrung oder Einzelpreis<\/li>\n<\/ul>\n<p>Sie k&ouml;nnen als <b>objElement <\/b>sowohl das Dokument selbst &uuml;bergeben als auch ein bestehendes Element. Um dem mit <b>objXML <\/b>referenzierten Dokument die ersten vier Elemente <b>Katalog<\/b>, <b>Artikelliste<\/b>, <b>Artikel <\/b>und <b>Artikelname <\/b>samt Inhalt hinzuzuf&uuml;gen, ben&ouml;tigen Sie mit dieser Funktion nur noch vier Anweisungen (und zus&auml;tzlich die Variablen-Deklarationen):<\/p>\n<pre>Set objKatalog = CreateSubElement(objXML, &quot;Katalog&quot;)\r\nSet objArtikelliste = CreateSubElement(objKatalog, &quot;Artikelliste&quot;)\r\nSet objArtikel = CreateSubElement(objArtikelliste, &quot;Artikel&quot;)\r\nSet objArtikelname = CreateSubElement(objArtikel, &quot;Artikelname&quot;, &quot;Artikelname erster Artikel&quot;)<\/pre>\n<p>Die Prozedur pr&uuml;ft einfach den Typ des mit <b>objElement<\/b> &uuml;bergebenen Objekts (entweder <b>DOMDocument <\/b>oder <b>IXMLDOMElement<\/b>) und ordnet das neue Element entsprechend unter. Sollte der Benutzer den optionalen Parameter <b>strText <\/b>angegeben haben, wird dem soeben erzeugten Objekt auch noch der Text hinzugef&uuml;gt. Den gr&ouml;&szlig;ten Teil des Dokuments k&ouml;nnen Sie allein mit den beiden Funktionen <b>AddPi <\/b>und <b>CreateSubElement <\/b>erstellen.<\/p>\n<p><b>Attribut hinzuf&uuml;gen<\/b><\/p>\n<p>Das Hinzuf&uuml;gen eines Attributs zu einem Element ben&ouml;tigt nur eine einzige Zeile. Im folgenden Beispiel soll dem Element <b>objArtikel <\/b>ein Attribut namens <b>ID <\/b>mit dem Wert des Feldes <b>ArtikelID <\/b>der Datensatzgruppe <b>rst<\/b> hinzugef&uuml;gt werden:<\/p>\n<pre>objArtikel.setAttribute &quot;ID&quot;, rst!ArtikelID<\/pre>\n<p><!--30percent--><\/p>\n<p>Auch wenn dies keine Vereinfachung bringt, haben wir auch f&uuml;r das Hinzuf&uuml;gen eines Attributs eine eigene Prozedur bereitgestellt. Sie finden diese in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-50-anchor\">Listing 4<\/a><\/span>.<\/p>\n<p class=\"listingueberschrift\">Listing 4: Hinzuf&uuml;gen eines Attributs zu einem Element<\/p>\n<pre>Public Sub CreateAttribute(objElement As MSXML2.IXMLDOMElement, strAttributename As String, _\r\n        strAttributeValue As String)\r\n    objElement.setAttribute strAttributename, strAttributeValue\r\nEnd Sub<\/pre>\n<p><b>Zwischenfazit<\/b><\/p>\n<p>Statt der urspr&uuml;nglichen Prozedur erhalten Sie nun ein wesentlich handlicheres Gebilde, das wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-55-anchor\">Listing 5<\/a><\/span> aussieht. Dadurch, dass die Werte direkt zugewiesen werden k&ouml;nnen, m&uuml;ssen Sie hier au&szlig;erdem viel weniger Variablen zum Speichern der Verweise auf die XML-Elemente hinzuf&uuml;gen.<\/p>\n<p class=\"listingueberschrift\">Listing 5: Erstellen des XML-Dokuments mit Hilfsfunktionen<\/p>\n<pre>Public Sub Katalog_()\r\n    Dim db As DAO.Database\r\n    Dim rst As DAO.Recordset\r\n    Dim objXML As MSXML2.DOMDocument\r\n    Dim objRoot As MSXML2.IXMLDOMElement\r\n    Dim objArtikelliste As MSXML2.IXMLDOMElement\r\n    Dim objArtikel As MSXML2.IXMLDOMElement\r\n    Set db = CurrentDb\r\n    Set rst = db.OpenRecordset(&quot;SELECT * FROM tblArtikel&quot;, dbOpenDynaset)\r\n    Set objXML = New MSXML2.DOMDocument\r\n    AddPI objXML\r\n    Set objRoot = CreateSubElement(objXML, &quot;Katalog&quot;)\r\n    CreateSubElement objRoot, &quot;Datum&quot;, &quot;11.07.2011&quot;\r\n    CreateSubElement objRoot, &quot;Zeit&quot;, &quot;12:29:49&quot;\r\n    Set objArtikelliste = CreateSubElement(objRoot, &quot;Artikelliste&quot;, &quot;&quot;)\r\n    Do While Not rst.EOF\r\n         Set objArtikel = CreateSubElement(objArtikelliste, &quot;Artikel&quot;, &quot;&quot;)\r\n        CreateAttribute objArtikel, &quot;ID&quot;, &quot;1&quot;\r\n        CreateSubElement objArtikel, &quot;Artikelname&quot;, &quot;Artikel 1&quot;\r\n        CreateSubElement objArtikel, &quot;Waehrung&quot;, &quot;EUR&quot;\r\n        CreateSubElement objArtikel, &quot;Einzelpreis&quot;, &quot;10,00&quot;\r\n        rst.MoveNext\r\n    Loop\r\n    Debug.Print FormatXML(objXML.XML)\r\nEnd Sub<\/pre>\n<p><b>XML-Baukasten<\/b><\/p>\n<p>Durch das geschickte Auslagern von wiederverwendbaren Code-Strukturen ben&ouml;tigen Sie nun wesentlich weniger Zeilen, um das gleiche Ziel zu erreichen. Wo aber bleibt nun die versprochene automatische Code-Erstellung Hier kommt sie &#8211; in Form des <b>XMLBuilders<\/b>.<\/p>\n<p>Die Grundidee ist es, die Struktur des zu erstellenden XML-Dokuments auszulesen und darauf basierend den VBA-Code zu erzeugen, der zum Erstellen genau dieses XML-Dokuments n&ouml;tig w&auml;re.<\/p>\n<p>Die nachfolgend vorgestellten Funktionen erstellen genau den Code, der zum Reproduzieren des Dokuments n&ouml;tig ist. Allerdings werden sich wiederholende Elemente automatisch ausgeschlossen! Das zweite Artikel-Element des folgenden Beispiels wird also beispielsweise ignoriert. Lediglich neue Elemente oder Attribute, die bislang noch nicht vorkamen, werden ber&uuml;cksichtigt:<\/p>\n<pre>&lt;xml version=&quot;1.0&quot;&gt;\r\n&lt;Katalog&gt;\r\n    &lt;Datum&gt;11.07.2011&lt;\/Datum&gt;\r\n    &lt;Zeit&gt;12:29:49&lt;\/Zeit&gt;\r\n    &lt;Artikelliste&gt;\r\n        &lt;Artikel ID=&quot;1&quot;&gt;\r\n            &lt;Artikelname&gt;Artikel 1&lt;\/Artikelname&gt;\r\n            &lt;Waehrung&gt;EUR&lt;\/Waehrung&gt;\r\n            &lt;Einzelpreis&gt;10,00&lt;\/Einzelpreis&gt;\r\n        &lt;\/Artikel&gt;\r\n        &lt;Artikel ID=&quot;2&quot;&gt;\r\n            &lt;Artikelname&gt;Artikel 2&lt;\/Artikelname&gt;\r\n            &lt;Waehrung&gt;EUR&lt;\/Waehrung&gt;\r\n            &lt;Einzelpreis&gt;20,00&lt;\/Einzelpreis&gt;\r\n        &lt;\/Artikel&gt;\r\n    &lt;\/Artikelliste&gt;\r\n&lt;\/Katalog&gt;<\/pre>\n<p><b><b>XML-Dokument analysieren<\/b><\/b><\/p>\n<p>Am einfachsten nutzen Sie die Funktionen des Moduls <b>mdlXMLBuilder<\/b>, wenn Sie das zu erstellende XML-Dokument als Vorlage verwenden, beispielsweise diese gek&uuml;rzte Variante des vorherigen Beispiels:<\/p>\n<pre>&lt;xml version=&quot;1.0&quot;&gt;\r\n&lt;Katalog&gt;\r\n    &lt;Datum&gt;11.07.2011&lt;\/Datum&gt;\r\n    &lt;Zeit&gt;12:29:49&lt;\/Zeit&gt;\r\n    &lt;Artikelliste&gt;\r\n        &lt;Artikel ID=&quot;1&quot;&gt;\r\n            &lt;Artikelname&gt;Artikel 1&lt;\/Artikelname&gt;\r\n            &lt;Waehrung&gt;EUR&lt;\/Waehrung&gt;\r\n            &lt;Einzelpreis&gt;10,00&lt;\/Einzelpreis&gt;\r\n        &lt;\/Artikel&gt;\r\n    &lt;\/Artikelliste&gt;\r\n&lt;\/Katalog&gt;<\/pre>\n<p>Speichern Sie das Dokument an geeigneter Stelle, am besten im Verzeichnis der Access-Datei mit dem Modul <b>mdlXMLBuilder<\/b>. Rufen Sie dann die Funktion <b>XMLBuilder<\/b> mit dem Dateinamen als Parameter auf und geben Sie das Ergebnis beispielsweise im Direktfenster aus (s. Bild 1):<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_05\/XMLCodeErsteller-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Erstellen einer XMLBuilder-Prozedur im Direktfenster<\/span><\/b><\/p>\n<pre>XMLBuilder CurrentProject.Path &amp; &quot;\\Katalog.xml&quot;<\/pre>\n<p>Die Funktion gibt das Ergebnis im Direktfenster aus. Die resultierende Prozedur sieht so wie in Bild 1 aus.<\/p>\n<p>Wenn Sie diese Prozedur aufrufen, erstellt sie genau das zuvor in der XML-Datei gespeicherte und als Vorlage dienende XML-Dokument. Nun, da Sie eine Prozedur haben, die Ihnen die Anweisungen zum Schreiben von XML-Dokumenten liefert, brauchen Sie das Ergebnis nur noch anzupassen. Sie m&uuml;ssten also beispielsweise den hier f&uuml;r das Attribut <b>ID <\/b>des Elements <b>Artikel <\/b>&uuml;bergebenen Ausdruck parametrisieren. Die Zeile<\/p>\n<pre>CreateAttribute objArtikel, &quot;ID&quot;, &quot;1&quot;<\/pre>\n<p>ersetzen Sie dann beispielsweise durch die folgende:<\/p>\n<pre>CreateAttribute objArtikel, &quot;ID&quot;, rst!ArtikelID<\/pre>\n<p>Au&szlig;erdem m&uuml;ssen Sie noch die beiden Variablen f&uuml;r die Objekte <b>db <\/b>und <b>rst <\/b>hinzuf&uuml;gen:<\/p>\n<pre>Dim db As DAO.Database\r\nDim rst As DAO.Recordset<\/pre>\n<p>Diese werden dann wie folgt instanziert:<\/p>\n<pre>Set db = CurrentDb\r\nSet rst = db.OpenRecordset(&quot;SELECT * FROM tblArtikel&quot;, dbOpenDynaset)<\/pre>\n<p>Schlie&szlig;lich fassen Sie die Anweisungen zum Erstellen des <b>Artikel<\/b>-Elements und seiner Unterelemente in eine <b>Do While<\/b>-Schleife ein:<\/p>\n<pre>Do While Not rst.EOF\r\n    Set objArtikel = CreateSubElement(objArtikelliste, &quot;Artikel&quot;, &quot;&quot;)\r\n    CreateAttribute objArtikel, &quot;ID&quot;, rst!ArtikelID \r\n    CreateSubElement objArtikel, &quot;Artikelname&quot;, rst!Artikelname\r\n    CreateSubElement objArtikel, &quot;Waehrung&quot;, &quot;EUR&quot;\r\n    CreateSubElement objArtikel, &quot;Einzelpreis&quot;, rst!Einzelpreis\r\n    rst.MoveNext\r\nLoop<\/pre>\n<p>Die konkret angegebenen Werte f&uuml;r den Artikelnamen und den Einzelpreis ersetzen Sie ebenfalls noch durch die in den entsprechenden Feldern der Datensatzgruppe enthaltenen Werte (<b>rst!&#8230;<\/b>).<\/p>\n<p><b>Technik beim Zusammenstellen des Codes<\/b><\/p>\n<p>Die in diesem Beitrag verwendete L&ouml;sung bezieht sich ausschlie&szlig;lich auf einfache Elemente mit oder ohne Wert und auf Attribute. Andere Elementtypen werden nicht unterst&uuml;tzt beziehungsweise k&ouml;nnten zu unvorhersehbaren Ergebnissen f&uuml;hren.<\/p>\n<p>Damit Sie gegebenenfalls Erg&auml;nzungen f&uuml;r weitere, hier nicht ber&uuml;cksichtigte Elementtypen vornehmen k&ouml;nnen, folgt nun die Erkl&auml;rung der Funktion der beiden f&uuml;r das Erstellen des Codes verwendeten Routinen.<\/p>\n<p>Die erste der beiden Routinen legt die grundlegenden Elemente an und ruft die zweite Routine auf, die sich je nach Verschachtelungstiefe der Elemente des XML-Dokuments selbst rekursiv aufruft (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-53-anchor\">Listing 6<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 6: Erstellen des Grundger&uuml;sts der Prozedur zum Ausgeben von XML-Dokumenten<\/p>\n<pre>Public Function XMLBuilder(strPath As String) As String\r\n    Dim objXML As MSXML2.DOMDocument\r\n    Dim objRoot As MSXML2.IXMLDOMElement\r\n    Dim strRoot As String\r\n    Dim objAttribute As MSXML2.IXMLDOMAttribute\r\n    Dim objChild As MSXML2.IXMLDOMElement\r\n    Dim strParentname As String\r\n    Dim strCode As String\r\n    Set objXML = LoadXML(strPath)\r\n    Set objRoot = objXML.documentElement\r\n    strRoot = objXML.documentElement.baseName\r\n    strCode = strCode &amp; &quot;Public Sub Create_&quot; &amp; strRoot &amp; vbCrLf\r\n    strCode = strCode &amp; &quot; Dim objXML As MSXML2.DOMDocument&quot; &amp; vbCrLf\r\n    ReDim Preserve strElements(1)\r\n    strElements(0) = &quot;\/&quot;\r\n    ReDim Preserve strDim(1)\r\n    strDim(0) = &quot;objXML&quot;\r\n    strCode = strCode &amp; &quot; Dim objRoot As MSXML2.IXMLDOMElement&quot; &amp; vbCrLf\r\n    strDim(1) = &quot;objRoot&quot;\r\n    strElements(1) = &quot;\/&quot; &amp; strRoot\r\n    strCode = strCode &amp; vbCrLf\r\n    strCode = strCode &amp; &quot; Set objXML = New MSXML2.DOMDocument&quot; &amp; vbCrLf\r\n    strCode = strCode &amp; &quot; AddPI objXML&quot; &amp; vbCrLf\r\n    strCode = strCode &amp; &quot; Set objRoot = CreateSubElement(objXML, &quot;&quot;&quot; &amp; strRoot &amp; &quot;&quot;&quot;)&quot; &amp; vbCrLf\r\n    For Each objAttribute In objRoot.Attributes\r\n        strCode = strCode &amp; &quot; CreateAttribute objRoot, &quot;&quot;&quot; &amp; objAttribute.Name &amp; &quot;&quot;&quot;, &quot;&quot;&quot; _\r\n            &amp; objAttribute.nodeTypedValue &amp; &quot;&quot;&quot;&quot; &amp; vbCrLf\r\n    Next objAttribute\r\n    strPath = &quot;\/&quot; &amp; strRoot\r\n    strParentname = &quot;objRoot&quot;\r\n    For Each objChild In objRoot.selectNodes(strPath &amp; &quot;\/*&quot;)\r\n        ElementBuilder objChild, 1, strPath, strParentname, strCode\r\n    Next objChild\r\n    strCode = strCode &amp; vbCrLf\r\n    strCode = strCode &amp; &quot; Debug.Print objXML.XML&quot; &amp; vbCrLf\r\n    strCode = strCode &amp; &quot;End Sub&quot; &amp; vbCrLf\r\n    XMLBuilder = strCode\r\nEnd Function<\/pre>\n<p>Nach dem Einlesen des XML-Objekts wird das Root-Element referenziert und dessen Name in der Variablen <b>strRoot <\/b>gespeichert. Dieser wird gleich zum Erstellen der ersten Codezeile genutzt, um den Prozedurnamen anzureichern &#8211; nach folgendem Schema:<\/p>\n<pre>Public Sub Create_&lt;Root-Element&gt;<\/pre>\n<p>Auf diese Weise kann die erzeugte Prozedur von solchen f&uuml;r andere XML-Dokumente unterschieden werden. Es folgen einige Deklarationsanweisungen, die jeweils durch Zeilenumbr&uuml;che (<b>vbCrLf<\/b>) getrennt an die in der Variablen <b>strCode <\/b>gespeicherte Zeichenkette angeh&auml;ngt werden:<\/p>\n<pre>Dim objXML As MSXML2.DOMDocument\r\nDim objRoot As MSXML2.IXMLDOMElement<\/pre>\n<p>F&uuml;r beide Objekte wird das Array <b>strDim<\/b>, das modulweit im Kopf des Moduls deklariert wurde, jeweils um ein Element vergr&ouml;&szlig;ert und mit den Objektnamen gef&uuml;llt, also <b>objXML <\/b>und <b>objRoot <\/b>&#8211; mehr dazu weiter unten. Au&szlig;erdem gibt es ein Array namens <b>strElements<\/b>, das die Pfade zu den Elementen (zum Beispiel <b>\/Katalog\/Artikelliste<\/b>) aufnimmt.<\/p>\n<p>Auch die folgenden beiden Zeilen werden f&uuml;r jede Prozedur ben&ouml;tigt und dementsprechend durch die Routine <b>XMLBuilder <\/b>hinzugef&uuml;gt:<\/p>\n<pre>Set objXML = New MSXML2.DOMDocument\r\nAddPI objXML<\/pre>\n<p>Die folgende Schleife durchl&auml;uft alle gegebenenfalls f&uuml;r das Root-Element angegebenen Attribute und f&uuml;gt jeweils eine Zeile wie die folgende zum Code der zu erstellenden Prozedur hinzu:<\/p>\n<pre>CreateAttribute objRoot, &lt;Attributname&gt;, &lt;Attributwert&gt;<\/pre>\n<p>Danach wird f&uuml;r jedes in der Ebene unterhalb des Root-Elements enthaltene Element je einmal die Prozedur <b>ElementBuilder <\/b>aufgerufen. Die untergeordneten Elemente werden dabei mit der Funktion <b>selectNodes <\/b>&uuml;ber den XPath-Ausdruck <b>\/&lt;Rootelement&gt;\/* <\/b>ermittelt, wobei <b>&lt;Rootelement&gt; <\/b>durch den Namen des Root-Elements, hier <b>Katalog<\/b>, ersetzt wird. Der rekursiven Funktion <b>ElementBuilder<\/b> werden dabei die folgenden Parameter &uuml;bergeben:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>objNode<\/b>: Verweis auf das aktuell durchlaufende Child-Element<\/li>\n<li class=\"aufz-hlung\"><b>intLevel<\/b>: Aktuelle Ebene, beim ersten Aufruf von der Prozedur <b>BuildXML <\/b>aus also <b>1<\/b><\/li>\n<li class=\"aufz-hlung\"><b>strPath<\/b>: Pfad zum &uuml;bergeordneten Element, beim ersten Aufruf also beispielsweise <b>\/Katalog<\/b><\/li>\n<li class=\"aufz-hlung\"><b>strParentname<\/b>: Name des &uuml;bergeordneten Objekts, hier <b>objRoot<\/b><\/li>\n<li class=\"aufz-hlung\"><b>strCode<\/b>: Stringvariable, in welcher der Code zusammengesetzt wird<\/li>\n<\/ul>\n<p>Nach dem Zusammenstellen des Codes f&uuml;r die untergeordneten Elemente h&auml;ngt die Prozedur noch eine Zeile an, die den ermittelten XML-Code in das Direktfenster schreibt &#8211; und nat&uuml;rlich darf die Zeile <b>End Sub <\/b>nicht fehlen.<\/p>\n<p>Die zu analysierende XML-Datei wird zun&auml;chst eingelesen &#8211; diesen Part erledigt die Funktion <b>LoadXML<\/b> (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-52-anchor\">Listing 7<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 7: Einlesen eines XML-Dokuments<\/p>\n<pre>Public Function LoadXML(strPath As String) As MSXML2.DOMDocument\r\n    Dim objXML As MSXML2.DOMDocument\r\n    Set objXML = New MSXML2.DOMDocument\r\n    With objXML\r\n        .Load strPath\r\n    End With\r\n    Set LoadXML = objXML\r\nEnd Function<\/pre>\n<p><b>Untergeordnete Elemente in Code umsetzen<\/b><\/p>\n<p>Mit nur einem Root-Element w&auml;ren wir an dieser Stelle schon fertig, aber die meisten XML-Dokumente enthalten nun noch einige weitere Ebenen. Um diese k&uuml;mmert sich die bereits erw&auml;hnte Prozedur <b>ElementBuilder<\/b> (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-54-anchor\">Listing 8<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 8: Erstellen des Codes f&uuml;r untergeordnete Elemente<\/p>\n<pre>Public Function ElementBuilder(objNode As MSXML2.IXMLDOMElement, intLevel As Integer, _\r\n        ByVal strPath As String, ByVal strParentname As String, strCode As String)\r\n    Dim objChild As MSXML2.IXMLDOMElement\r\n    Dim i As Integer\r\n    Dim strElement As String\r\n    Dim strValue As String\r\n    Dim bolDim As Boolean\r\n    Dim bolElement As Boolean\r\n    Dim objAttribute As MSXML2.IXMLDOMAttribute\r\n    For i = 0 To UBound(strElements)\r\n        If strElements(i) = strPath &amp; &quot;\/&quot; &amp; objNode.baseName Then\r\n            bolElement = True\r\n        End If\r\n    Next i\r\n    If bolElement = False Then\r\n        ReDim Preserve strElements(UBound(strElements) + 1)\r\n        strElements(UBound(strElements)) = strPath &amp; &quot;\/&quot; &amp; objNode.baseName\r\n    End If\r\n    strPath = strPath &amp; &quot;\/&quot; &amp; objNode.baseName\r\n    strElement = objNode.baseName\r\n    If bolElement = False Then\r\n        If objNode.selectNodes(strPath &amp; &quot;\/*&quot;).length &gt; 0 Then\r\n            strValue = &quot;&quot;\r\n        Else\r\n            strValue = objNode.nodeTypedValue\r\n        End If\r\n        If objNode.selectNodes(strPath &amp; &quot;\/*&quot;).length &gt; 0 Or objNode.Attributes.length &gt; 0 Then\r\n            For i = 0 To UBound(strDim)\r\n                If strDim(i) = &quot;obj&quot; &amp; objNode.baseName Then\r\n                    bolDim = True\r\n                End If\r\n            Next i\r\n            If bolDim = False Then\r\n                ReDim Preserve strDim(UBound(strDim) + 1)\r\n                strDim(UBound(strDim)) = &quot;obj&quot; &amp; objNode.baseName\r\n                strCode = strCode &amp; &quot; Dim obj&quot; &amp; objNode.baseName _\r\n                    &amp; &quot; As MSXML2.IXMLDOMElement&quot; &amp; vbCrLf\r\n            End If\r\n            strCode = strCode &amp; &quot; Set obj&quot; &amp; objNode.baseName &amp; &quot; = CreateSubElement(&quot; _\r\n                &amp; strParentname &amp; &quot;, &quot;&quot;&quot; &amp; strElement &amp; &quot;&quot;&quot;, &quot;&quot;&quot; &amp; strValue &amp; &quot;&quot;&quot;)&quot; &amp; vbCrLf\r\n        Else\r\n            strCode = strCode &amp; &quot; CreateSubElement &quot; &amp; strParentname &amp; &quot;, &quot;&quot;&quot; &amp; strElement _\r\n                &amp; &quot;&quot;&quot;, &quot;&quot;&quot; &amp; strValue &amp; &quot;&quot;&quot;&quot; &amp; vbCrLf\r\n        End If\r\n    End If\r\n    For Each objAttribute In objNode.Attributes\r\n        strCode = strCode &amp; &quot; CreateAttribute obj&quot; &amp; objNode.baseName &amp; &quot;, &quot;&quot;&quot; _\r\n            &amp; objAttribute.Name &amp; &quot;&quot;&quot;, &quot;&quot;&quot; &amp; objAttribute.nodeTypedValue &amp; &quot;&quot;&quot;&quot; &amp; vbCrLf\r\n        ReDim Preserve strElements(UBound(strElements) + 1)\r\n        strElements(UBound(strElements)) = strPath &amp; &quot;@&quot; &amp; objAttribute.Name\r\n    Next objAttribute\r\n    strParentname = &quot;obj&quot; &amp; objNode.baseName\r\n    For Each objChild In objNode.selectNodes(strPath &amp; &quot;\/*&quot;)\r\n        ElementBuilder objChild, intLevel + 1, strPath, strParentname, strCode\r\n    Next objChild\r\nEnd Function<\/pre>\n<p>Die Funktion erweitert zun&auml;chst den Wert der Variablen <b>strPath<\/b> um einen Slash und den Namen des aktuell behandelten Elements, beim ersten Aufruf mit unserer Beispieldatei also etwa auf <b>Katalog\/Artikelliste<\/b>. Die Variable <b>strPath<\/b> wird als Wert (<b>ByVal<\/b>) &uuml;bergeben, damit sich die &auml;nderungen an dieser Variablen nicht auf die gleichnamige Variable der aufrufenden Instanz niederschlagen.<\/p>\n<p>Danach pr&uuml;ft die Prozedur, ob der Pfad des aktuellen Elements bereits einmal bearbeitet wurde. In diesem Fall wird die Variable <b>bolElement <\/b>auf <b>True <\/b>eingestellt, was sp&auml;ter dazu f&uuml;hrt, dass das Element nicht doppelt angelegt wird. Anschlie&szlig;end tr&auml;gt die Prozedur den Pfad des aktuellen Elements, also beispielsweise <b>\/Katalog\/Artikelliste\/Artikel\/Artikelname<\/b>, in das Array <b>strElements <\/b>ein. <\/p>\n<p>Der Name des aktuell bearbeiteten Elements landet in der Variablen <b>strElement<\/b>. Bereits an dieser Stelle pr&uuml;ft die Routine erstmals, ob das aktuelle Element einen Wert enth&auml;lt (wie <b>&lt;Artikelname&gt;Chang&lt;\/Artikelname&gt;) <\/b>oder ob es weitere Unterelemente liefert. Liegt ein Wert vor, wird dieser &uuml;ber die Eigenschaft <b>nodeTypedValue <\/b>ausgelesen und in der Variablen <b>strValue <\/b>gespeichert.<\/p>\n<p><b>Variablen f&uuml;r Elemente<\/b><\/p>\n<p>Dies ist nicht nur f&uuml;r die sp&auml;tere Zuweisung des Wertes zu diesem Element wichtig, sondern auch beim Anlegen der ben&ouml;tigten Variablen. Die Prozedur ben&ouml;tigt eine Variable f&uuml;r ein Element, wenn dieses sp&auml;ter noch mit weiteren Unterelementen oder mit Attributen ausgestattet werden soll. Dies ist im Beispiel etwa f&uuml;r das Element <b>Artikel <\/b>der Fall:<\/p>\n<pre>Dim objArtikel As MSXML2.IXMLDOMElement\r\nSet objArtikel = CreateSubElement(objArtikelliste, &quot;Artikel&quot;, &quot;&quot;)\r\nCreateAttribute objArtikel, &quot;ID&quot;, &quot;1&quot;<\/pre>\n<p>In diesem dynamisch erzeugten Code wird eine Variable zum Speichern des Artikel-Elements deklariert, dann wird dieses erzeugt und &uuml;ber die Variable referenziert, damit dem Element in der folgenden Anweisung ein Attribut (oder auch ein weiteres untergeordnetes Element) hinzugef&uuml;gt werden kann. <\/p>\n<p>Hier wird nun offenbar, wof&uuml;r die Objektnamen im Array <b>strDim <\/b>gespeichert werden: Beim Erzeugen des Codes zum Anlegen eines neuen Elements werden jeweils alle als <b>obj&#8230; <\/b>deklarierten Objekte durchlaufen, um keine Variable doppelt zu definieren. Dementsprechend tr&auml;gt die Prozedur die entsprechenden Variablennamen auch beim Anlegen von Zeilen zum Deklarieren neuer Objekte in die Liste <b>strDim <\/b>ein.<\/p>\n<p>Zusammengefasst pr&uuml;ft die Prozedur, ob ein Element Unterelemente oder Attribute enth&auml;lt. Falls ja, durchl&auml;uft sie alle bisher angelegten Variablen. Ist eine Variable bereits vorhanden, wird <b>bolDim <\/b>auf <b>True <\/b>eingestellt. Die folgende Zeile pr&uuml;ft die Variable <b>bolDim<\/b>. Wenn diese den Wert <b>False <\/b>enth&auml;lt, die Variable also noch nicht vorhanden ist, wird die entsprechende Deklarationszeile hinzugef&uuml;gt und das Array <b>strDim <\/b>um den Namen, also etwa <b>objArtikel<\/b>, erg&auml;nzt. Wir bearbeiten immer noch den Fall, dass das Element Attribute oder Unterelemente enth&auml;lt. Hier f&uuml;gt die Prozedur nun schlie&szlig;lich die entsprechende Zeile hinzu, also etwa diese:<\/p>\n<pre>Set objArtikel = CreateSubElement(objArtikelliste, &quot;Artikel&quot;, &quot;&quot;)<\/pre>\n<p>Wenn sich herausstellt, dass das Element keine untergeordneten Elemente oder Attribute enth&auml;lt, wird im anderen Zweig der <b>If&#8230;Then<\/b>-Bedingung eine Zeile wie die folgende angelegt:<\/p>\n<pre>CreateSubElement objArtikel, &quot;Artikelname&quot;, &quot;Artikel 1&quot;<\/pre>\n<p>Die nun folgende <b>For Each<\/b>-Schleife durchl&auml;uft alle Attribute des aktuellen Elements und f&uuml;gt f&uuml;r jedes Attribut eine Zeile wie die folgende hinzu:<\/p>\n<pre>CreateAttribute objArtikel, &quot;ID&quot;, &quot;1&quot;<\/pre>\n<p>Hier ist zu beachten, dass auch die Pfade zu den Attributen, also etwa <b>\/Katalog\/Artikelliste\/Artikel@ID<\/b>, in das Array <b>strElements <\/b>aufgenommen werden, damit kein Attribut doppelt definiert wird.<\/p>\n<p>Schlie&szlig;lich folgt eine <b>For Each<\/b>-Schleife &uuml;ber alle untergeordneten Elemente, wobei die Funktion sich selbst f&uuml;r jedes dieser Elemente einmal aufruft und die entsprechenden Zeilen zum Code hinzuf&uuml;gt.<\/p>\n<p><b>Einsatz<\/b><\/p>\n<p>Am einfachsten rufen Sie den XMLBuilder &uuml;ber das Direktfenster auf und kopieren dann den erzeugten Code in das gew&uuml;nschte Modul.<\/p>\n<p>Sie k&ouml;nnen jedoch auch eine der beiden folgenden Methoden verwenden:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>XMLCodeSpeichern<\/b>: Erwartet zus&auml;tzlich zum Pfad des Quelldokuments noch die Angabe der Datei, in die der Codeschnipsel gespeichert werden soll.<\/li>\n<li class=\"aufz-hlung\"><b>XMLCodeInZwischenablage<\/b>: Erzeugt das XML-Dokument und f&uuml;gt es in die Zwischenablage ein, damit Sie es direkt in das gew&uuml;nschte Modul einf&uuml;gen k&ouml;nnen.<\/li>\n<\/ul>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Mit dem hier vorgestellten Tool k&ouml;nnen Sie den Code zum Nachbilden nahezu beliebiger XML-Dokumente erstellen. Damit sparen Sie eine Menge Zeit und m&uuml;ssen sich nicht mit Flei&szlig;arbeiten besch&auml;ftigen.<\/p>\n<p>Sollten Sie auf Beispiele sto&szlig;en, mit denen diese L&ouml;sung nicht funktioniert, schicken Sie uns das betreffende XML-Dokument einfach an <b>info@access-im-unternehmen.de<\/b>!<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>XMLCodeErsteller.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{B312A195-A0FD-449C-B94C-46DE3A1EBC54}\/aiu_801.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ein XML-Code-Builder &#8211; was soll das denn sein Nun: Stellen Sie sich einfach vor, Ihr Kunde liefert Ihnen eine Datenbank und ein XML-Dokument und m&ouml;chte, dass Sie ihm den Code liefern, mit dem er ein so aufgebautes XML-Dokument mit Daten aus der Datenbank f&uuml;llen kann. Kein Problem, sagen Sie &#8211; es ist zwar etwas Flei&szlig;arbeit, aber das bekommen Sie schon hin. Ach: Ist Flei&szlig;arbeit nicht das erkl&auml;rte Feindbild eines Access-Entwicklers Genau! Und deshalb liefert dieser Beitrag Ihnen die Werkzeuge, um das Grundger&uuml;st des zu erstellenden Codes zu erstellen.<\/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":[662011,66052011,44000027],"tags":[],"class_list":["post-55000801","post","type-post","status-publish","format-standard","hentry","category-662011","category-66052011","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>XML-Code-Builder  - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/XMLCodeBuilder_\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"XML-Code-Builder\" \/>\n<meta property=\"og:description\" content=\"Ein XML-Code-Builder - was soll das denn sein Nun: Stellen Sie sich einfach vor, Ihr Kunde liefert Ihnen eine Datenbank und ein XML-Dokument und m&ouml;chte, dass Sie ihm den Code liefern, mit dem er ein so aufgebautes XML-Dokument mit Daten aus der Datenbank f&uuml;llen kann. Kein Problem, sagen Sie - es ist zwar etwas Flei&szlig;arbeit, aber das bekommen Sie schon hin. Ach: Ist Flei&szlig;arbeit nicht das erkl&auml;rte Feindbild eines Access-Entwicklers Genau! Und deshalb liefert dieser Beitrag Ihnen die Werkzeuge, um das Grundger&uuml;st des zu erstellenden Codes zu erstellen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/XMLCodeBuilder_\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:58:30+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg08.met.vgwort.de\/na\/959c6f030b05449ca3537e4a3f7b691c\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"22\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLCodeBuilder_\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLCodeBuilder_\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"XML-Code-Builder\",\"datePublished\":\"2020-05-22T21:58:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLCodeBuilder_\\\/\"},\"wordCount\":2748,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLCodeBuilder_\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/959c6f030b05449ca3537e4a3f7b691c\",\"articleSection\":[\"2011\",\"5\\\/2011\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLCodeBuilder_\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLCodeBuilder_\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLCodeBuilder_\\\/\",\"name\":\"XML-Code-Builder - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLCodeBuilder_\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLCodeBuilder_\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/959c6f030b05449ca3537e4a3f7b691c\",\"datePublished\":\"2020-05-22T21:58:30+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLCodeBuilder_\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLCodeBuilder_\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLCodeBuilder_\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/959c6f030b05449ca3537e4a3f7b691c\",\"contentUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/959c6f030b05449ca3537e4a3f7b691c\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/XMLCodeBuilder_\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"XML-Code-Builder\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"XML-Code-Builder  - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/XMLCodeBuilder_\/","og_locale":"de_DE","og_type":"article","og_title":"XML-Code-Builder","og_description":"Ein XML-Code-Builder - was soll das denn sein Nun: Stellen Sie sich einfach vor, Ihr Kunde liefert Ihnen eine Datenbank und ein XML-Dokument und m&ouml;chte, dass Sie ihm den Code liefern, mit dem er ein so aufgebautes XML-Dokument mit Daten aus der Datenbank f&uuml;llen kann. Kein Problem, sagen Sie - es ist zwar etwas Flei&szlig;arbeit, aber das bekommen Sie schon hin. Ach: Ist Flei&szlig;arbeit nicht das erkl&auml;rte Feindbild eines Access-Entwicklers Genau! Und deshalb liefert dieser Beitrag Ihnen die Werkzeuge, um das Grundger&uuml;st des zu erstellenden Codes zu erstellen.","og_url":"https:\/\/access-im-unternehmen.de\/XMLCodeBuilder_\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:58:30+00:00","og_image":[{"url":"http:\/\/vg08.met.vgwort.de\/na\/959c6f030b05449ca3537e4a3f7b691c","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"22\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/XMLCodeBuilder_\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/XMLCodeBuilder_\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"XML-Code-Builder","datePublished":"2020-05-22T21:58:30+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/XMLCodeBuilder_\/"},"wordCount":2748,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/XMLCodeBuilder_\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/959c6f030b05449ca3537e4a3f7b691c","articleSection":["2011","5\/2011","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/XMLCodeBuilder_\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/XMLCodeBuilder_\/","url":"https:\/\/access-im-unternehmen.de\/XMLCodeBuilder_\/","name":"XML-Code-Builder - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/XMLCodeBuilder_\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/XMLCodeBuilder_\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/959c6f030b05449ca3537e4a3f7b691c","datePublished":"2020-05-22T21:58:30+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/XMLCodeBuilder_\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/XMLCodeBuilder_\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/XMLCodeBuilder_\/#primaryimage","url":"http:\/\/vg08.met.vgwort.de\/na\/959c6f030b05449ca3537e4a3f7b691c","contentUrl":"http:\/\/vg08.met.vgwort.de\/na\/959c6f030b05449ca3537e4a3f7b691c"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/XMLCodeBuilder_\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"XML-Code-Builder"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000801","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000801"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000801\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000801"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000801"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000801"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}