Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

XML per VBA

Forumthread: XML per VBA

XML per VBA
02.12.2020 18:27:25
Werner
Hallo,
benötige nochmals eine kleine Hilfestellung bzgl. XML.
Mein Code sieht so aus:
'neues XML - Objekt erzeugen
Set xml = New MSXML2.DOMDocument60
' Die oberste Hierarchiestufe erstellen
xml.LoadXML ""
xml.appendChild xml.createProcessingInstruction("xml", "version=""1.0"" encoding=""ISO-8859-1""")
Set xmlORDER_LIST = xml.createElement("ORDER_LIST")
xml.appendChild xmlORDER_LIST
' Die ORDER unter ORDER_LIST erstellen
Set xmlORDER = xmlORDER_LIST.appendChild(xml.createElement("ORDER"))
xmlORDER_LIST.appendChild xmlORDER
' Creates Attribute für ORDER Element
Set xmlORDERATTR = xml.createAttribute("xmlns")
xmlORDERATTR.NodeValue = "http://www.opentrans.org/XMLSchema/1.0"
xmlORDER.setAttributeNode xmlORDERATTR
Set xmlORDER_HEADER = xmlORDER.appendChild(xml.createElement("ORDER_HEADER"))
xmlORDER.appendChild xmlORDER_HEADER
und die XML Datei so:
?xml version="1.0" encoding="ISO-8859-1"?
ORDER_LIST
ORDER xmlns="http://www.opentrans.org/XMLSchema/1.0"
ORDER_HEADER xmlns=""
CONTROL_INFO
GENERATOR_INFO Shopware5 GENERATOR_DATE 02.12.2020 CONTROL_INFO
ORDER_INFO
Das Problem ist im Element "ORDER_HEADER" dort steht nun auch xmlns="" und das sollte nicht sein. Kann man das Attribut auch wieder ausstellen.
Vielen Dank im Voraus
Werner
Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: XML per VBA
02.12.2020 19:20:33
Tino
Hallo,
reicht es nicht die Zeilen wegzulassen?
Set xmlORDER_HEADER = xmlORDER.appendChild(xml.createElement("ORDER_HEADER"))
xmlORDER.appendChild xmlORDER_HEADER
Gruß Tino
AW: XML per VBA
02.12.2020 19:38:22
Werner
Hallo Tino,
die XML Struktur muss einem bestimmten Schema folgen, insofern kann ich die Zeilen nicht weglassen.
Nach xmlORDER_HEADER kommen weitere Node.
Beste Grüße
Werner
Anzeige
AW: XML per VBA
02.12.2020 20:13:48
Tino
Hallo,
dann zeige den kompletten Code zum erstellen der XML.
Gruß Tino
AW: XML per VBA
02.12.2020 20:49:46
Werner
Hallo,
nachstehend der Code, ist aber noch nicht vollständig.
Wie gesagt das Problem liegt bei ORDER_HEADER xmlns="".
Das Attribut xmlns="" wird aus dem Knoten "ORDER" übernommen und das darf nicht sein.
Für Lösungsansätze wäre ich dankbar.
Sub Bestellungen_XML()
Dim xml                 As Object
Dim xmlORDER_LIST       As MSXML2.IXMLDOMElement
Dim xmlORDER            As MSXML2.IXMLDOMElement
Dim xmlORDER_HEADER     As MSXML2.IXMLDOMElement
Dim xmlCONTROL_INFO     As MSXML2.IXMLDOMElement
Dim xmlGENERATOR_INFO   As MSXML2.IXMLDOMElement
Dim xmlORDER_INFO       As MSXML2.IXMLDOMElement
Dim xmlORDER_PARTIES    As MSXML2.IXMLDOMElement
Dim xmlBUYER_PARTY      As MSXML2.IXMLDOMElement
Dim xmlORDERATTR        As IXMLDOMAttribute
Dim lngCounter          As Long
Dim lngZeile            As Long
lngZeile = Range("A" & Rows.Count).End(xlUp).Row
'Dateispeicherort
Const Pfad As String = "H:\XML\"
Const Dateiname As String = "Test.xml"
'neues XML - Objekt erzeugen
Set xml = CreateObject("MSXML2.DOMDocument")
xml.appendChild xml.createProcessingInstruction("xml", "version=""1.0"" encoding=""ISO-8859- _
1""")
' Creates root element
Set xmlORDER_LIST = xml.createElement("ORDER_LIST")
xml.appendChild xmlORDER_LIST
' Creates element ORDER under xmlORDER_LIST
Set xmlORDER = xml.createElement("ORDER")
xmlORDER_LIST.appendChild xmlORDER
' Creates Attribute to the ORDER Element
Set xmlORDERATTR = xml.createAttribute("xmlns")
xmlORDERATTR.NodeValue = "http://www.opentrans.org/XMLSchema/1.0"
xmlORDER.setAttributeNode xmlORDERATTR
' Create element ORDER_HEADER under ORDER
Set xmlORDER_HEADER = xml.createElement("ORDER_HEADER")
xmlORDER.appendChild xmlORDER_HEADER
' Create element xmlCONTROL_INFO under ORDER_HEADER
Set xmlCONTROL_INFO = xml.createElement("CONTROL_INFO")
xmlORDER_HEADER.appendChild xmlCONTROL_INFO
' Create element GENERATOR_INFO under ORDER_HEADER
Set xmlGENERATOR_INFO = xml.createElement("GENERATOR_INFO")
xmlCONTROL_INFO.appendChild xmlGENERATOR_INFO
xmlGENERATOR_INFO.Text = "Test"
' Create element ORDER_INFO under ORDER
Set xmlORDER_INFO = xml.createElement("ORDER_INFO")
xmlORDER_HEADER.appendChild xmlORDER_INFO
' Create element ORDER_PARTIES under ORDER_INFO
Set xmlORDER_PARTIES = xml.createElement("ORDER_PARTIES")
xmlORDER_INFO.appendChild xmlORDER_PARTIES
'Create element BUYER_PARTY under ORDER_PARTIES
Set xmlBUYER_PARTY = xml.createElement("BUYER_PARTY")
xmlORDER_PARTIES.appendChild xmlBUYER_PARTY
'usw
xml.Save Pfad + Dateiname
End Sub
Beste Grüße
Werner
Anzeige
AW: XML per VBA
02.12.2020 22:21:12
Tino
Hallo,
versuche es mal so.
Nicht getestet weil ich mich am Rechner bin.
Kann erst morgen besser danach schauen.
Sub Bestellungen_XML()
Dim xml                 As Object
Dim xmlORDER_LIST       As MSXML2.IXMLDOMElement
Dim xmlORDER            As MSXML2.IXMLDOMElement
Dim xmlORDER_HEADER     As MSXML2.IXMLDOMElement
Dim xmlCONTROL_INFO     As MSXML2.IXMLDOMElement
Dim xmlGENERATOR_INFO   As MSXML2.IXMLDOMElement
Dim xmlORDER_INFO       As MSXML2.IXMLDOMElement
Dim xmlORDER_PARTIES    As MSXML2.IXMLDOMElement
Dim xmlBUYER_PARTY      As MSXML2.IXMLDOMElement
Dim xmlORDERATTR        As IXMLDOMAttribute
Dim lngCounter          As Long
Dim lngZeile            As Long
lngZeile = Range("A" & Rows.Count).End(xlUp).Row
'Dateispeicherort
Const Pfad As String = "H:\XML\"
Const Dateiname As String = "Test.xml"
'neues XML - Objekt erzeugen
Set xml = CreateObject("MSXML2.DOMDocument")
xml.appendChild xml.createProcessingInstruction("xml", "version=""1.0"" encoding=""ISO-8859- _
_
1""")
' Creates root element
Set xmlORDER_LIST = xml.createElement("ORDER_LIST")
xml.appendChild xmlORDER_LIST
' Creates element ORDER under xmlORDER_LIST
Set xmlORDER = xml.createElement("ORDER")
xmlORDER_LIST.appendChild xmlORDER
' Creates Attribute to the ORDER Element
Set xmlORDERATTR = xml.createAttribute("xmlns")
xmlORDERATTR.NodeValue = "http://www.opentrans.org/XMLSchema/1.0"
xmlORDER.setAttributeNode xmlORDERATTR
' Create element xmlCONTROL_INFO under ORDER_HEADER
Set xmlCONTROL_INFO = xml.createElement("CONTROL_INFO")
xmlORDER.appendChild xmlCONTROL_INFO
' Create element GENERATOR_INFO under ORDER_HEADER
Set xmlGENERATOR_INFO = xml.createElement("GENERATOR_INFO")
xmlCONTROL_INFO.appendChild xmlGENERATOR_INFO
xmlGENERATOR_INFO.Text = "Test"
' Create element ORDER_INFO under ORDER
Set xmlORDER_INFO = xml.createElement("ORDER_INFO")
xmlORDER.appendChild xmlORDER_INFO
' Create element ORDER_PARTIES under ORDER_INFO
Set xmlORDER_PARTIES = xml.createElement("ORDER_PARTIES")
xmlORDER_INFO.appendChild xmlORDER_PARTIES
'Create element BUYER_PARTY under ORDER_PARTIES
Set xmlBUYER_PARTY = xml.createElement("BUYER_PARTY")
xmlORDER_PARTIES.appendChild xmlBUYER_PARTY
'usw
xml.Save Pfad + Dateiname
End Sub

Anzeige
AW: XML per VBA
03.12.2020 09:05:03
Werner
Guten Morgen,
vielleicht bin ich noch nicht so wach, aber ich sehe kein Unterschied in den Codes.
Gruß
Werner
bis du jetzt wach?
03.12.2020 11:57:00
Tino
Hallo,
ORDER_HEADER wird nicht mehr in die XML geschrieben!
Gruß Tino
AW: bis du jetzt wach?
03.12.2020 12:15:11
Werner
Hallo,
jetzt gesehen.
ORDER_HEADER muss aber sein und ausserdem wird xmlns="" dann in den nächsten Node CONTROL_INFO geschrieben.
Hilft also nicht.
Gruß
Werner
Anzeige
AW: bis du jetzt wach?
03.12.2020 12:15:24
Werner
Hallo,
jetzt gesehen.
ORDER_HEADER muss aber sein und ausserdem wird xmlns="" dann in den nächsten Node CONTROL_INFO geschrieben.
Hilft also nicht.
Gruß
Werner
AW: bis du jetzt wach?
03.12.2020 12:32:53
Tino
Hallo,
jetzt denke ich habe ich dich erst richtig verstanden!
Sub Bestellungen_XML()
Dim xml                 As Object
Dim xmlORDER_LIST       As MSXML2.IXMLDOMElement
Dim xmlORDER            As MSXML2.IXMLDOMElement
Dim xmlORDER_HEADER     As MSXML2.IXMLDOMElement
Dim xmlCONTROL_INFO     As MSXML2.IXMLDOMElement
Dim xmlGENERATOR_INFO   As MSXML2.IXMLDOMElement
Dim xmlORDER_INFO       As MSXML2.IXMLDOMElement
Dim xmlORDER_PARTIES    As MSXML2.IXMLDOMElement
Dim xmlBUYER_PARTY      As MSXML2.IXMLDOMElement
Dim lngCounter          As Long
Dim lngZeile            As Long
lngZeile = Range("A" & Rows.Count).End(xlUp).Row
'Dateispeicherort
Const Pfad As String = "H:\XML\"
Const Dateiname As String = "Test.xml"
'neues XML - Objekt erzeugen
Set xml = CreateObject("MSXML2.DOMDocument")
xml.appendChild xml.createProcessingInstruction("xml", "version=""1.0"" encoding=""ISO-8859- _
1""")
' Creates root element
Set xmlORDER_LIST = xml.createElement("ORDER_LIST")
xml.appendChild xmlORDER_LIST
' Creates element ORDER under xmlORDER_LIST
Set xmlORDER = xml.createElement("ORDER")
xmlORDER_LIST.appendChild xmlORDER
xmlORDER.setAttribute "xmlns", "http://www.opentrans.org/XMLSchema/1.0"
' Create element ORDER_HEADER under ORDER
Set xmlORDER_HEADER = xml.createElement("ORDER_HEADER")
xmlORDER.appendChild xmlORDER_HEADER
' Create element xmlCONTROL_INFO under ORDER_HEADER
Set xmlCONTROL_INFO = xml.createElement("CONTROL_INFO")
xmlORDER_HEADER.appendChild xmlCONTROL_INFO
' Create element GENERATOR_INFO under ORDER_HEADER
Set xmlGENERATOR_INFO = xml.createElement("GENERATOR_INFO")
xmlCONTROL_INFO.appendChild xmlGENERATOR_INFO
xmlGENERATOR_INFO.Text = "Test"
' Create element ORDER_INFO under ORDER
Set xmlORDER_INFO = xml.createElement("ORDER_INFO")
xmlORDER_HEADER.appendChild xmlORDER_INFO
' Create element ORDER_PARTIES under ORDER_INFO
Set xmlORDER_PARTIES = xml.createElement("ORDER_PARTIES")
xmlORDER_INFO.appendChild xmlORDER_PARTIES
'Create element BUYER_PARTY under ORDER_PARTIES
Set xmlBUYER_PARTY = xml.createElement("BUYER_PARTY")
xmlORDER_PARTIES.appendChild xmlBUYER_PARTY
'usw
xml.Save Pfad + Dateiname
End Sub
Gruß Tino
Anzeige
AW: bis du jetzt wach?
03.12.2020 13:44:00
Werner
Hallo Tino,
das war die Lösung.
Danke
Gruß
Werner
;
Anzeige

Infobox / Tutorial

XML mit VBA erstellen und verwalten


Schritt-für-Schritt-Anleitung

Um ein XML-Dokument mit VBA zu erstellen, kannst du die msxml2.domdocument60-Bibliothek verwenden. Hier ist eine Schritt-für-Schritt-Anleitung, wie du dies umsetzen kannst:

  1. VBA-Editor öffnen: Gehe zu Excel und öffne den VBA-Editor mit ALT + F11.

  2. Referenz hinzufügen: Stelle sicher, dass die Bibliothek für Microsoft XML, v6.0 aktiviert ist. Gehe zu ExtrasVerweise und aktiviere Microsoft XML, v6.0.

  3. Neues Modul erstellen: Klicke mit der rechten Maustaste im Projekt-Explorer und wähle EinfügenModul.

  4. Code einfügen: Füge den folgenden Code in das Modul ein:

    Sub Bestellungen_XML()
       Dim xml As Object
       Dim xmlORDER_LIST As MSXML2.IXMLDOMElement
       Dim xmlORDER As MSXML2.IXMLDOMElement
       Dim xmlORDER_HEADER As MSXML2.IXMLDOMElement
       Dim xmlCONTROL_INFO As MSXML2.IXMLDOMElement
       Dim xmlGENERATOR_INFO As MSXML2.IXMLDOMElement
       Dim xmlORDER_INFO As MSXML2.IXMLDOMElement
       Dim xmlORDER_PARTIES As MSXML2.IXMLDOMElement
       Dim xmlBUYER_PARTY As MSXML2.IXMLDOMElement
       Dim xmlORDERATTR As IXMLDOMAttribute
    
       ' Neues XML - Objekt erzeugen
       Set xml = CreateObject("msxml2.domdocument")
       xml.appendChild xml.createProcessingInstruction("xml", "version=""1.0"" encoding=""ISO-8859-1""")
    
       ' Creates root element
       Set xmlORDER_LIST = xml.createElement("ORDER_LIST")
       xml.appendChild xmlORDER_LIST
    
       ' Creates element ORDER under xmlORDER_LIST
       Set xmlORDER = xml.createElement("ORDER")
       xmlORDER_LIST.appendChild xmlORDER
    
       ' Creates Attribute to the ORDER Element
       Set xmlORDERATTR = xml.createAttribute("xmlns")
       xmlORDERATTR.NodeValue = "http://www.opentrans.org/XMLSchema/1.0"
       xmlORDER.setAttributeNode xmlORDERATTR
    
       ' Create element ORDER_HEADER under ORDER
       Set xmlORDER_HEADER = xml.createElement("ORDER_HEADER")
       xmlORDER.appendChild xmlORDER_HEADER
    
       ' Save XML
       xml.Save "H:\XML\Test.xml"
    End Sub
  5. Makro ausführen: Führe das Makro aus, um die XML-Datei zu erstellen.


Häufige Fehler und Lösungen

  1. Problem: xmlns="" erscheint im ORDER_HEADER-Element. Lösung: Stelle sicher, dass du das xmlns-Attribut nur für das ORDER-Element festlegst und nicht für ORDER_HEADER. Überprüfe die hierarchische Struktur deines XML.

  2. Problem: XML-Datei wird nicht gespeichert. Lösung: Überprüfe den angegebenen Pfad und stelle sicher, dass er existiert. Der Pfad muss für den Benutzer schreibbar sein.


Alternative Methoden

Wenn du mit msxml2.domdocument nicht zufrieden bist, kannst du auch die MSXML2.DOMDocument60-Bibliothek verwenden, die zusätzliche Funktionen bietet. Hier ist ein Beispiel:

Dim xml As New MSXML2.DOMDocument60

Diese Methode kann dir helfen, falls du spezifische Funktionen benötigst, die nicht in der älteren Version verfügbar sind.


Praktische Beispiele

Hier ist ein einfaches Beispiel, wie du ein XML-Dokument mit mehreren Knoten erstellen kannst:

Set xmlORDER_HEADER = xml.createElement("ORDER_HEADER")
xmlORDER.appendChild xmlORDER_HEADER

Set xmlCONTROL_INFO = xml.createElement("CONTROL_INFO")
xmlORDER_HEADER.appendChild xmlCONTROL_INFO

Set xmlGENERATOR_INFO = xml.createElement("GENERATOR_INFO")
xmlCONTROL_INFO.appendChild xmlGENERATOR_INFO
xmlGENERATOR_INFO.Text = "Shopware5"

Diese Struktur zeigt, wie du hierarchische Beziehungen im XML-Dokument erstellen kannst.


Tipps für Profis

  • Verwende vba appendchild, um Kinderknoten einfach hinzuzufügen.
  • Achte darauf, die richtigen msxml-Versionen zu verwenden, um Kompatibilitätsprobleme zu vermeiden.
  • Teste deinen Code in kleinen Schritten, um Fehler schnell zu identifizieren.

FAQ: Häufige Fragen

1. Wie funktioniert die createobject("msxml2.domdocument")-Methode?
Diese Methode erstellt ein neues DOM-Dokument-Objekt, welches die Struktur deines XML-Dokuments repräsentiert.

2. Was ist der Unterschied zwischen msxml2.domdocument und msxml2.domdocument60?
msxml2.domdocument60 bietet zusätzliche Funktionen und verbesserte Leistung im Vergleich zu älteren Versionen. Es wird empfohlen, die neueste Version zu verwenden, wenn du mit XML in Excel arbeitest.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige