XML-Datei in JSON umwandeln
Der Service Task „XML-Datei in JSON umwandeln“ liest XML, als Text oder als Datei aus dem Pantarey-Speicher, und wandelt es in ein JSON-Objekt um, auf das die folgenden Schritte mit JSONata zugreifen. Attribute erhalten den Präfix attr_, Zahlen und Wahrheitswerte werden als solche erkannt. Typischer Einsatz ist das XML einer E-Rechnung, das PDF-Anhänge extrahieren aus einem ZUGFeRD-PDF geliefert hat, oder die Antwort einer XML-Schnittstelle.
Technischer Name prio_parseXML · Kategorie im Dialog „Service-Task auswählen“: Daten & Verknüpfungen
Wann wird dieser Service verwendet?
- E-Rechnungen auslesen: Die Musterfirma GmbH übernimmt Rechnungsnummer, Datum und Bruttobetrag aus der
factur-x.xmlihrer Lieferantenrechnungen in den Eingangsrechnungs-Datensatz. - XML-Schnittstellen: Eine Preisliste oder Bestandsmeldung eines Distributors kommt als XML-Datei und wird in Datensätze übernommen.
- Konfigurations- oder Exportdateien aus anderen Systemen werden im Prozess gelesen.
Eingabe
| Feld | Typ | Pflicht | Bedeutung |
|---|---|---|---|
xml |
String oder Datei-Objekt | ja | Das XML als Text oder als {referenceId, filename, contentType}. Eine Datei wird vollständig als UTF-8 gelesen |
options |
Objekt | nein | Parser-Optionen. Standard: ignoreAttributes: false, attributeNamePrefix: "attr_". Weitere nützliche Optionen: parseTagValue: false (Zahlen bleiben Text), isArray (Elemente immer als Array) |
options.processEntities |
false oder Objekt |
nein | Grenzen für XML-Entities. Die Grenzen können verkleinert oder mit false abgeschaltet werden, nicht vergrößert |
{
"xml": eingangsrechnung.xmlDatei,
"options": { "ignoreAttributes": false, "attributeNamePrefix": "attr_" }
}
Direkt aus dem Ergebnis von „PDF-Anhänge extrahieren“ unter anhaenge:
{ "xml": anhaenge[name='factur-x.xml'].data }
Ausgabe
Das geparste Objekt ohne Hülle. Aus
<?xml version="1.0" encoding="UTF-8"?>
<rsm:Invoice xmlns:rsm="urn:x" version="2.1">
<ID>RE-2026-0042</ID>
<IssueDate format="102">20261108</IssueDate>
<Line no="1"><Qty unit="H87">2</Qty><Price>19.9</Price><Text>Schrauben</Text></Line>
<Total currency="EUR">40.3</Total>
</rsm:Invoice>
wird
{
"?xml": { "attr_version": "1.0", "attr_encoding": "UTF-8" },
"rsm:Invoice": {
"ID": "RE-2026-0042",
"IssueDate": { "#text": 20261108, "attr_format": "102" },
"Line": { "Qty": { "#text": 2, "attr_unit": "H87" }, "Price": 19.9, "Text": "Schrauben", "attr_no": "1" },
"Total": { "#text": 40.3, "attr_currency": "EUR" },
"attr_xmlns:rsm": "urn:x",
"attr_version": "2.1"
}
}
Regeln: Namensräume bleiben im Schlüssel (rsm:Invoice). Ein Element mit Attributen und Text liefert den Text unter #text. Ein Kindelement wird zum Objekt, mehrere gleichnamige zum Array. Ein leeres Element wird "". Zahlen in Textform werden zu Zahlen (20261108), true/false zu Wahrheitswerten. Das Ergebnis landet unter dem Ergebnispfad, z. B. rechnung_xml.
In JSONata werden Schlüssel mit Doppelpunkt oder # in Backticks gesetzt:
rechnung_xml.`rsm:Invoice`.IssueDate.`#text`
Fehler und Verhalten
- Fehlende Eingabe wirft
xml missing.; ein anderer Typ (z. B. eine Zahl) wirftInvalid XML format. Expected: String or object with "reference". - Fehlerhaftes XML und überschrittene Entity-Grenzen (Schutz vor aufgeblähten Dokumenten) werfen ebenfalls. Mit Fehler-Randereignis läuft der Prozess dort weiter, ohne Randereignis endet der Vorgang im Fehler mit Wiederaufsetzpunkt und Fehler-Mail an den Prozessverantwortlichen.
- Der Service liefert nie
{status, message}. - Fehler werden nicht wiederholt, da sie nicht vorübergehend sind. Zeitgrenze 900 Sekunden; es wird nichts gespeichert.
- Im Dry Run liefert der Schritt eine Beispielausgabe aus dem Katalog.
Beispiel
Eingangsrechnung bei der Musterfirma GmbH: PDF-Anhänge extrahieren hat unter anhaenge die factur-x.xml geliefert.
- XML-Datei in JSON umwandeln mit
{ "xml": anhaenge[name='factur-x.xml'].data }, Ergebnispfadrechnung_xml. - Ausgabe: das Objekt mit
rsm:CrossIndustryInvoiceals oberstem Schlüssel. - Nächster Schritt: Ein Datenbank-Schritt legt die Eingangsrechnung an, mit Input-Ausdruck wie
{
"rechnungsnummer": rechnung_xml.`rsm:CrossIndustryInvoice`.`rsm:ExchangedDocument`.`ram:ID`,
"brutto": rechnung_xml.`rsm:CrossIndustryInvoice`.`rsm:SupplyChainTradeTransaction`.`ram:ApplicableHeaderTradeSettlement`.`ram:SpecifiedTradeSettlementHeaderMonetarySummation`.`ram:GrandTotalAmount`.`#text`
}
Häufige Fragen
Bei einer Rechnung mit einer Position ist Line kein Array, bei mehreren schon.
Ein einzelnes Kindelement wird zum Objekt, mehrere zum Array. In JSONata erzwingt [rechnung_xml.…Line] immer ein Array; alternativ options.isArray für die betreffenden Elemente setzen.
Die Bestellnummer 007 kommt als 7 an.
Zahlen in Textform werden standardmäßig in Zahlen gewandelt. Mit "options": { "parseTagValue": false } bleiben alle Werte Text; führende Nullen bleiben erhalten.
Der Zugriff rechnung_xml.rsm:Invoice liefert nichts.
Schlüssel mit Doppelpunkt oder # müssen in JSONata in Backticks stehen: rechnung_xml.`rsm:Invoice`.
Attribute sollen @_ statt attr_ heißen.
options.attributeNamePrefix entsprechend setzen; mit "ignoreAttributes": true entfallen Attribute ganz.
Nächster Schritt
PDF-Anhänge extrahieren: das XML einer E-Rechnung aus dem ZUGFeRD-PDF holen.