Zum Inhalt

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.xml ihrer 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) wirft Invalid 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.

  1. XML-Datei in JSON umwandeln mit { "xml": anhaenge[name='factur-x.xml'].data }, Ergebnispfad rechnung_xml.
  2. Ausgabe: das Objekt mit rsm:CrossIndustryInvoice als oberstem Schlüssel.
  3. 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.