XML ist ein spezielles Protokoll, um strukturiert Daten in einer Zeichenkette zu beschreiben. XML-Daten werden oft dazu verwendet, andere Anwendungen wie ein CRM oder ERP mit Daten zu versorgen.
TCE verwendet hierzu die in Windows-Systemen zur Verfügung gestellte Typbibliothek Microsoft XML, welche in verschiedenen Versionen verfügbar ist.
Die XML-Struktur soll auf dem Server erzeugt werden, daher ist es nur erforderlich, den Schalter Typelib für diese Typbibliothek zu aktivieren. Sie erreichen die Typelib durch Klicken auf den Button Neue Typbibliothek.
In diesem Beispiel wollen wir für alle Materialien ein XML erzeugen.
Ein wohlgeformtes XML hat folgendes Aussehen:
<Root xmlns:dt="urn:schemas-microsoft-com:datatypes" Produkt="Sigma 25">
<Material Anzahl="1" ID="476154" Positionspreis="4.416" Bezeichnung="Sigma Lampenfassung einflammig"/>
<Material Anzahl="1" ID="456843" Positionspreis="4.416" Bezeichnung="Anschlusskabel EU 2,5 Meter"/>
<Material Anzahl="1" ID="978651" Positionspreis="14.076" Bezeichnung="Netzteil 50W"/>
</Root>
Es besteht aus genau einem Wurzelknoten, hier mit dem Namen Root. Der Wurzelknoten beginnt mit dem Tag <Root> und endet mit dem Tag </Root>.
Ein Knoten kann über ein oder mehrere Attribute verfügen, hier zum Beispiel die Begriffe xmlns:dt und Produkt. Attribute bekommen einen Wert über ein Gleichheitszeichen und den eigentlichen Wert in Hochkommas.
Zwischen den Tags des Wurzelknotens können ein oder mehrere Knoten stehen, die der gleichen Syntax folgen:
<Material>…</Material>'
Eine verkürzte Schreibweise ist möglich, wenn der Knoten keine weiteren Kindknoten besitzt.
<Material />
Wir wollen nun in TCE diesen XML erzeugen.
Wir legen in der Klasse Start eine Funktion mit dem Namen Schnittstelle an:
Function Schnittstelle(ByRef pDOM As MSXML2.DOMDocument) As Void
Dim DOM As New MSXML2.DOMDocument, oEle As MSXML2.IXMLDOMElement, XMLRoot As MSXML2.IXMLDOMNode
XMLRoot := DOM.appendChild(DOM.createElement("Root"))
oEle := XMLRoot
oEle.setAttribute("xmlns:dt", "urn:schemas-microsoft-com:datatypes")
XMLRoot.attributes.setNamedItem(DOM.createAttribute("Produkt")).nodeTypedValue := Produkt.ObjectClass.Name
Dim Mat As "Material"
For Each Mat In Me.ObjectList("Material",, True)
Mat.Schnittstelle(DOM, XMLRoot)
End For
pDOM := DOM
End Function
In der Microsoft XML Bibliothek heißt das Objekt zur Beschreibung eines XML DOMDocument, ein Objekt zur Beschreibung von Datentyp-Konventionen IXMLDOMElement, und ein Objekt zur Beschreibung eines Knotens im XML IXMLDOMNode.
Die Funktion erzeugt zunächst ein Objekt vom Typ DOMDocument in der Variablen DOM. Dies erfolgt schon mit Hilfe des New bei der Festlegung der Variablen.
Dim DOM As New MSXML2.DOMDocument, oEle As MSXML2.IXMLDOMElement, XMLRoot As MSXML2.IXMLDOMNode
Dann wird der Wurzelknoten Root über das DOMDocument erzeugt und die Referenz auf das Knotenobjekt in der Variablen XMLRoot gespeichert.
XMLRoot := DOM.appendChild(DOM.createElement("Root"))
Nun wird das (nicht unbedingt notwendige) Element zur Datentyp-Beschreibung im Wurzelknoten erzeugt:
oEle := XMLRoot
oEle.setAttribute("xmlns:dt", "urn:schemas-microsoft-com:datatypes")
Jetzt wird ein Attribut Produkt im Wurzelknoten angelegt und dessen Wert festgelegt:
XMLRoot.attributes.setNamedItem(DOM.createAttribute("Produkt")).nodeTypedValue := Produkt.ObjectClass.Name
Nun werden in einer Schleife alle Material-Objekte durchlaufen. Für jedes Material-Objekt wird die Funktion Schnittstelle mit Übergabe des DOM und des Wurzelknotens aufgerufen.
Dim Mat As "Material"
For Each Mat In Me.ObjectList("Material",, True)
Mat.Schnittstelle(DOM, XMLRoot)
End For
Das DOM-Objekt wird an den Parameter der Funktion übergeben.
pDOM := DOM
Wie sieht nun die Funktion Schnittstelle der Klasse Material aus?
Function Schnittstelle(ByRef DOM As MSXML2.DOMDocument, ByRef ParentNode As MSXML2.IXMLDOMNode) As Void
Dim Node As MSXML2.IXMLDOMNode
Node := ParentNode.appendChild(DOM.createElement("Material"))
Node.attributes.setNamedItem(DOM.createAttribute("Anzahl")).nodeTypedValue := Anzahl
Node.attributes.setNamedItem(DOM.createAttribute("ID")).nodeTypedValue := Me.ObjectClass.Name
Node.attributes.setNamedItem(DOM.createAttribute("Positionspreis")).nodeTypedValue := Positionspreis
Node.attributes.setNamedItem(DOM.createAttribute("Bezeichnung")).nodeTypedValue := Me.ObjectDescription
End Function
Als erstes wird ein neuer Knoten erzeugt, und unter den Knoten ParentNode gehängt. Die Referenz auf den neuen Knoten wird in der Variablen Node gespeichert.
Node := ParentNode.appendChild(DOM.createElement("Material"))
Danach werden vier Attribute an diesen Knoten gebunden:
Anzahl, ID, Positionspreis und Bezeichnung
Nun wollen wir die XML-Erzeugung ausprobieren:
Wir legen im Hauptmenü einen Menüpunkt zum Aufruf der Schnittstelle an und im Click-Event folgenden Code:
Dim DOM As MSXML2.DOMDocument
Schnittstelle(DOM)
MsgBox(DOM.xml)
Sie sollten folgendes Ergebnis erhalten: