Einleitung
Das Arbeiten mit der APIs wie der von enaio erfordert häufig das Erzeugen von XML-Inhalten im eigenen Code. Nicht selten sehe ich dabei, dass XMLs als String aufgebaut werden:
query_xml = '<DMSQuery><Archive name="Patient"><ObjectType name="Patient" type="FOLDER"><Fields field_schema="DEF"><Field name="Name" /><Field name="Vorname" /><Field name="PLZ" /><Field name="Ort">Example Value</Field></Fields></ObjectType></Archive></DMSQuery>'
Soweit so einfach. Sollen nun aber nicht drei Felder übergeben werden, sondern 20 oder ergeben sich diese Felder aus einem vorherigen Schritt dynamisch, wird es schon kniffeliger. Und was, wenn ein Feldinhalt kein reiner Text von A-z ist, sondern ein Zeichen wie <
enthält, welches das XML zerstört?
Sinnvollerweise werden XMLs niemals „von Hand“ aus Strings zusammengebaut. Viel sicherer und flexibler lassen sich diese mit Generatorklassen und -bibliotheken erzeugen. Für Python wäre dies im Rahmen des Standardumfangs xml.etree.ElementTree und dazugehörige Objekte.
Schreibweise mit Wiedererkennungswert
Im Rahmen meiner Arbeiten für die enaio®-API-Aufrufe aus dem ecmind_blue_client wollte ich eine Generatorklasse nutzen, welche die Optik eines XMLs möglichst im Code sichtbar macht. Python bietet hier viele Möglichkeiten, noch hat mich aber keine 100%-ig überzeugt. In Ermangelung eines guten Fundes habe ich aktuell meine eigene Bibliothek geschaffen, welche als Open Source veröffentlicht ist: XmlElement
Hiermit kann ein XML in Python notiert werden und dabei dem Endprodukt ähnlich sehen:
from XmlElement import XmlElement as X
query_xml = X('DMSQuery', s=[
X('Archive', {'name': 'Patient'}, [
X('ObjectType', {'name': 'Patient', 'type': 'FOLDER'}, [
X('Fields', {'field_schema': 'DEF'}, [
X('Field', {'name': 'Name'}),
X('Field', {'name': 'Vorname'}),
X('Field', {'name': 'PLZ'}),
X('Field', {'name': 'Ort'}, t='Example Value')
])
])
])
])
print(query_xml.to_string())
Vergleiche:
<DMSQuery>
<Archive name="Patient">
<ObjectType name="Patient" type="FOLDER">
<Fields field_schema="DEF">
<Field name="Name" />
<Field name="Vorname" />
<Field name="PLZ" />
<Field name="Ort">Example Value</Field>
</Fields>
</ObjectType>
</Archive>
</DMSQuery>
Weitere Möglichkeiten
Natürlich können auch XMLs ausgelesen werden, ergänzt, über Elemente iteriert etc. Bei Fragen hierzu ergänze ich gerne Beispiele.