XML-Import und -Export (Python) #
Python-Beispiele für den XML-Import und -Export mit EULANDA. Die vollständige Objektreferenz finden Sie unter XMLLIB-Objekt.
Alle Beispiele auf dieser Seite verwendenimport win32com.clientund setzen das Paketpywin32voraus. Installation und Einrichtung sind unter Python beschrieben.
Artikel aus XML-Datei importieren #
Liest eine XML-Datei und importiert die enthaltenen Artikel in EULANDA. Das Beispiel nutzt die EULANDA COM-Schnittstelle (iScript).
import win32com.client
app = win32com.client.Dispatch("Eulanda.Application")
cli = app.Clients(0)
cli.Active = True
xml_eul = cli.CreateObject("XMLLIB")
desktop = cli.Properties("FOLDER.DESKTOP")
xml_eul.LoadFromFile(desktop + "\\ARTIKEL.XML")
xml_eul.SaveToDB("SALESARTICLE")
xml_eul = None
cli = None
app = None
Artikel programmatisch erzeugen und importieren (COM) #
Erzeugt ein XML-Dokument über Microsoft.XMLDOM und importiert es über das XMLLIB-Objekt.
import win32com.client
from datetime import datetime
def add_element(xml_doc, parent, name, value):
element = xml_doc.createElement(name)
parent.appendChild(element)
parent.lastChild.text = str(value)
app = win32com.client.Dispatch("Eulanda.Application")
cli = app.Clients(0)
cli.Active = True
xml_eul = cli.CreateObject("XMLLIB")
# XML-Dokument aufbauen
xml_doc = win32com.client.Dispatch("Microsoft.XMLDOM")
xml_doc.async_ = False
xml_doc.loadXML(
'<?xml version="1.0" encoding="WINDOWS-1252"?>'
"<EULANDA></EULANDA>"
)
root = xml_doc.documentElement
# Metadaten
metadata = xml_doc.createNode(1, "METADATA", "")
root.appendChild(metadata)
add_element(xml_doc, metadata, "VERSION", "1.1")
add_element(xml_doc, metadata, "GENERATOR", "Python")
add_element(xml_doc, metadata, "DATEFORMAT", "ISO8601")
add_element(xml_doc, metadata, "FLOATFORMAT", "US")
add_element(xml_doc, metadata, "FIELDNAMES", "NATIVE")
add_element(xml_doc, metadata, "DATE", datetime.now().strftime("%Y-%m-%dT%H:%M:%S"))
# Artikelliste
artikel_liste = xml_doc.createNode(1, "ARTIKELLISTE", "")
root.appendChild(artikel_liste)
# Erster Artikel
artikel = xml_doc.createNode(1, "ARTIKEL", "")
artikel_liste.appendChild(artikel)
add_element(xml_doc, artikel, "ID.ALIAS", "4711")
add_element(xml_doc, artikel, "ARTNUMMER", "4711")
add_element(xml_doc, artikel, "KURZTEXT1", "Mein Kurztext zu 4711")
add_element(xml_doc, artikel, "LANGTEXT", "Mein Langtext zu 4711")
add_element(xml_doc, artikel, "VK", "47.23")
# Zweiter Artikel
artikel = xml_doc.createNode(1, "ARTIKEL", "")
artikel_liste.appendChild(artikel)
add_element(xml_doc, artikel, "ID.ALIAS", "0815")
add_element(xml_doc, artikel, "ARTNUMMER", "0815")
add_element(xml_doc, artikel, "KURZTEXT1", "Mein Kurztext zu 0815")
add_element(xml_doc, artikel, "LANGTEXT", "Mein Langtext zu 0815")
add_element(xml_doc, artikel, "VK", "66.65")
# Import ausführen
xml_eul.LoadFromXml(xml_doc.documentElement.xml)
xml_eul.SaveToDB("SALESARTICLE")
print("Import abgeschlossen.")
Artikel als XML exportieren (COM) #
Exportiert alle Artikel aus EULANDA in eine XML-Datei.
import win32com.client
import os
app = win32com.client.Dispatch("Eulanda.Application")
cli = app.Clients(0)
cli.Active = True
xml_eul = cli.CreateObject("XMLLIB")
xml_eul.LoadFromDB("SALESARTICLE")
desktop = cli.Properties("FOLDER.DESKTOP")
xml_eul.SaveToFile(os.path.join(desktop, "ArtikelExport.xml"))
print(f"{xml_eul.RecordCount} Artikel exportiert.")
XML nativ mit Python erzeugen (ohne COM) #
Für einfache Fälle kann das XML auch direkt mit Python erzeugt und dann per ADO importiert werden. Dieses Beispiel nutzt xml.etree.ElementTree aus der Python-Standardbibliothek.
import win32com.client
import xml.etree.ElementTree as ET
from datetime import datetime
# XML-Dokument aufbauen
eulanda = ET.Element("EULANDA")
# Metadaten
metadata = ET.SubElement(eulanda, "METADATA")
ET.SubElement(metadata, "VERSION").text = "1.1"
ET.SubElement(metadata, "GENERATOR").text = "Python-ET"
ET.SubElement(metadata, "DATEFORMAT").text = "ISO8601"
ET.SubElement(metadata, "FLOATFORMAT").text = "US"
ET.SubElement(metadata, "FIELDNAMES").text = "NATIVE"
ET.SubElement(metadata, "DATE").text = datetime.now().strftime("%Y-%m-%dT%H:%M:%S")
# Artikelliste
artikel_liste = ET.SubElement(eulanda, "ARTIKELLISTE")
# Artikel hinzufuegen
artikel_daten = [
{"nr": "PY-001", "text": "Python-Artikel 1", "preis": "29.95"},
{"nr": "PY-002", "text": "Python-Artikel 2", "preis": "49.50"},
]
for a in artikel_daten:
artikel = ET.SubElement(artikel_liste, "ARTIKEL")
ET.SubElement(artikel, "ID.ALIAS").text = a["nr"]
ET.SubElement(artikel, "ARTNUMMER").text = a["nr"]
ET.SubElement(artikel, "KURZTEXT1").text = a["text"]
ET.SubElement(artikel, "VK").text = a["preis"]
# Als String fuer XMLLIB
xml_string = ET.tostring(eulanda, encoding="unicode")
# Import ueber EULANDA COM
app = win32com.client.Dispatch("Eulanda.Application")
cli = app.Clients(0)
cli.Active = True
xml_eul = cli.CreateObject("XMLLIB")
xml_eul.LoadFromXml(xml_string)
xml_eul.SaveToDB("SALESARTICLE")
print(f"{len(artikel_daten)} Artikel importiert.")
Siehe auch #
- XMLLIB-Objekt – Alle Methoden und Optionen
- XML-Schnittstelle – Formatspezifikation und Datenobjekte
- Scripting Host – Weitere COM-Beispiele