Programmierung eines XML Dokument in NAV mit MSXML DOM
Hin und wieder ist es von Nöten Daten aus Microsoft Dynamics NAV in Form einer XML Datei zu exportieren. Wenn Sie nicht mit der Programmierung von MSXML DOM vertraut sind kann das erstellen eines XML Dokumentes eine Menge Zeit in Anspruch nehmen. Das Ziel dieses Beitrags ist es ein einfaches Beispiel XML Dokument zu erzeugen, um Ihnen den Start in diesem Bereich der Programmierung einfach zu gestalten.
Warum benutzen wir in diesem Beispiel nicht die XML-Ports? Selbstverständlich können Sie auch die XML-Ports benutzen. Allerdings begrenzen Sie damit Ihre Möglichkeiten auf die gegeben Funktionalität der XML-Ports. Eine Begrenzung ist z.B. das XML-Ports keine Namespaces unterstützt.
Wenn Sie nun eines Tages glauben, Sie benötigen eine Funktionalität, die XML-Ports Ihnen nicht bieten ist es am einfachsten die MSXML DOM Methoden einzusetzen. Als Einsteiger ist MSXML DOM bedeutend komplexer als die XML-Ports, aber wenn man den Anfang verstanden hat und das Hinzufügen und Suchen von Daten/Werten anwenden kann werden Sie sehen, das dass MSXML DOM nicht viel komplizierter ist als die XML-Ports.
Ein XML Dokument ist hierarchisch organisiert. Es besteht aus Elementen und Knoten. Jede Information wird dem Dokument nach und nach hinzugefügt.
Lassen Sie uns mit einem sehr einfachen XML Dokument beginnen.
Erstellen Sie eine neue Codeunit mit 3 Variablen:
Name DataType Subtype Length
XMLDoc Automation 'Microsoft XML, v4.0'.DOMDocument
DOMNode Automation 'Microsoft XML, v4.0'.IXMLDOMNode
DomTextNode Automation 'Microsoft XML, v4.0'.IXMLDOMText
In diesem Beispiel habe ich die MSXML Version 4 verwendet. Sie können natürlich auch jede andere MSXML Version verwenden wie z.B. 5 oder 6. Meistens wird die Version 4 verwendet, da dort alle benötigten Methoden beinhaltet sind und Abwärtskompatibel zu den älteren Versionen ist.
Initialisierung des Dokumentes:
OnRun()
CREATE(XMLDoc);
XMLDoc.async(FALSE);
Die Methode asynch = False sorgt dafür, das ein Dokument komplett eingelesen wird.
Wenn es keine speziellen Gründe gibt, die dagegen sprechen das Dokument ganz in den Speicher einzulesen sollten Sie diese Methode verwenden.
Das gilt primär für den Fall, dass Sie ein Dokument in NAV einlesen. Mit dieser Methode stellen Sie sicher, dass das komplette XML Dokument in den Speicher gelesen wird, bevor Sie es weiterverarbeiten. Wenn diese Methode nicht verwenden, kann es sein das Sie das Dokument verarbeiten, bevor es komplett eingelesen wurde.
An diesem Punkt erstellen wir einen neuen Knoten und fügen ihn dem Dokument an:
DOMNode := XMLDoc.createNode(1,'NodeName','');
XMLDoc.appendChild(DOMNode);
Danach fügen wir dem bereits erstellen Knoten noch einen Wert hinzu. Dieses erfolgt im ähnlich wie das Erstellen eines Knotens.
DOMTextNode := XMLDoc.createTextNode('NodeValue');
DOMNode.appendChild(DOMTextNode);
Sie können zusätzliche jegliche benötigenden Elemente dem Dokument hinzufügen. Wie z.B. Knoten(Nodes), Text, Attribute(attribute).
Um die Dokumentenstruktur zu überprüfen, können Sie das XML Dokument auf Festplatte speichern und danach z.B. im Internet Explorer öffnen.
XMLDoc.save('C:\XML\MyXML.xml');
Hinweise: Wenn Sie Windows Vista einsetzten fehlt Ihnen wahrscheinlich die Berechtigung auf dem Root-Verzeichnis C:\ Daten abzuspeichern. Am einfachsten ist es, Sie erstellen einen Ordner, wie z.B. XML.
Starten Sie nun die Codeunit und Sie erhalten ein sehr einfaches XML Dokument:
<NodeName>NodeValue</NodeName>
Wiederholen Sie nun die eben durchgeführten Schritte um dem Dokument noch weitere Knoten hinzuzufügen und diese dann dem XML Dokument anzufügen.
Das erreichen Sie in dem Sie wie folgt vorgehen:
Erstellen Sie eine neue Variable:
NewDOMNode : 'Microsoft XML, v4.0'.IXMLDOMNode
Initialisieren Sie den neuen Knoten:
NewDOMNode := XMLDoc.createNode(1,'NewNode','');
DOMNode.appendChild(NewDOMNode);
Fügen Sie dem Knoten einen Wert hinzu.
DOMTextNode := XMLDoc.createTextNode('NewNodeValue');
NewDOMNode.appendChild(DOMTextNode);
Ihr Dokument nun eine Struktur vorweisen wie:
- <NodeName>
NodeValue
<NewNode>NewNodeValue</NewNode>
</NodeName>
Hinzufügen von Namespaces und Attributen:
Sie können nun dem ganzen Dokument oder nur einzelnen Knoten einen Namespace zuweisen. Um ein Namespace dem Dokument zu zuweisen gehen Sie bitte zu der relevanten Zeile zurück und fügen den dritten Parameter hinzu:
DOMNode := XMLDoc.createNode(1,'NodeName','MyNameSpace');
Abschließend können wir Attribute einem Knoten hinzufügen. Dies erfolgt ganz ähnlich wie dem Hinzufügen von Werten zu einem Knoten.
Erstellen Sie eine neue Automation Variable:
XMLAttributeNode : 'Microsoft XML, v5.0'.IXMLDOMAttribute
Initialisieren Sie das Attribut und fügen Sie es dem Knoten an.
XMLAttributeNode := XMLDoc.createAttribute('ID');
XMLAttributeNode.value := '10000';
DOMNode.attributes.setNamedItem(XMLAttributeNode);
Die Codeunit sollte nun wie folgt aussehen:
// Initialisierung des Dokuments
CREATE(XMLDoc);
//Knoten erstellen und dem Dokument hinzufügen. „MyNameSpacefunction“ ist der Namespace
DOMNode := XMLDoc.createNode(1,'NodeName','MyNameSpace');
XMLDoc.appendChild(DOMNode);
//Hinzufügen von Werten (Text) zu dem Knoten
DOMTextNode := XMLDoc.createTextNode('NodeValue');
DOMNode.appendChild(DOMTextNode);
// Hinzufügen eines Attributs zu dem Knoten
XMLAttributeNode := XMLDoc.createAttribute('ID');
XMLAttributeNode.value := '10000';
DOMNode.attributes.setNamedItem(XMLAttributeNode);
// Initialisierung eines Knoten
NewDOMNode := XMLDoc.createNode(1,'NewNode','');
DOMNode.appendChild(NewDOMNode);
// Hinzufügen von Text zu dem neuen Knoten:
DOMTextNode := XMLDoc.createTextNode('NewNodeValue');
NewDOMNode.appendChild(DOMTextNode);
// Speichern des Dokumentes auf der Festplatte
XMLDoc.save('C:\XML\MyXML.xml');
Weitere Referenzen:
MSXML ist ausführlich beschrieben im MSXML Software Development Kit (MSXMLSDK). Ich empfehle Ihnen sich dieses herunterzuladen um die Online Hilfe zur Referenz aller MSXML DDOM Methoden benutzen zu können.
These postings are provided "AS IS" with no warranties and confer no rights.
You assume all risk for your use.
Sebastian Röttel
Microsoft Dynamics Germany
Microsoft Customer Service and Support (CSS) EMEA