araç köşesi

XML in JSON

Ein XML-Dokument in JSON umwandeln, ohne Attribute und wiederholte Tags zu verlieren

Ihre Daten bleiben bei Ihnen. Die Umwandlung läuft im Browser; nichts wird an einen Server gesendet.

So funktioniert es

Fügen Sie den XML-Text links ein, das JSON erscheint rechts beim Tippen. Vier Regeln bestimmen die Umwandlung. Attribute kommen mit einem @ vor dem Namen in das Objekt, damit sie nicht mit einem gleichnamigen Kindelement zusammenfallen. Ein Element, das nur Text enthält, wird direkt zu diesem Text; hat es zusätzlich Attribute oder Kindelemente, wandert der Text unter den Schlüssel '#text'. Gleichnamige Geschwisterelemente unter demselben Eltern-Element werden zu einem Array zusammengefasst, in der Reihenfolge des Dokuments. CDATA-Inhalte werden wörtlich übernommen, Kommentare und die <?xml?>-Deklaration werden übersprungen. Ist das Dokument nicht wohlgeformt, entsteht keine Ausgabe, sondern eine Meldung mit dem Tag und der Zeile, an der die Auswertung stehen geblieben ist; ein nicht geschlossenes Tag, ein nicht passendes schließendes Tag und ein Attributwert ohne Anführungszeichen werden dabei getrennt gemeldet. Das Ergebnis lässt sich mit einem Klick kopieren oder als .json-Datei sichern, und nichts davon verlässt Ihr Gerät.

Dieses Werkzeug ist auch als xml in json umwandeln, xml zu json, xml in json konvertieren, xml datei lesen, xml parser online bekannt.

Was ist XML?

XML (Extensible Markup Language) zeichnet Daten mit verschachtelten Tags aus: Jeder Inhalt steht zwischen einem öffnenden und einem schließenden Tag, zusätzliche Angaben hängen als Attribute daran. Es ähnelt HTML, aber die Menge der Tag-Namen liegt nicht fest — wer die Daten definiert, wählt sie selbst. Ein großer Teil der institutionellen Software läuft weiter darauf: SOAP-Dienste, RSS-Feeds, Sitemaps, das Innere von Office-Dokumenten, Rechnungs- und Bankformate wie ZUGFeRD oder SEPA und unzählige Konfigurationsdateien. Als wohlgeformt gilt ein Dokument nur mit genau einem Wurzelelement, einem schließenden Tag zu jedem öffnenden und Anführungszeichen um jeden Attributwert.

Was ist CDATA?

Ein CDATA-Abschnitt sagt dem Parser, alles darin als reinen Text zu behandeln, und wird zwischen <![CDATA[ und ]]> geschrieben. Normalerweise gilt ein < oder & im Inhalt als Beginn eines Tags oder eines Entity und zerstört das Dokument; dagegen hilft entweder, jedes Zeichen als &lt; und &amp; zu maskieren, oder die ganze Passage in CDATA zu setzen. Felder mit Quelltext, einem HTML-Ausschnitt oder freiem Text voller Sonderzeichen werden so deutlich lesbarer. Dieses Werkzeug übernimmt CDATA-Inhalte unverändert und rührt die Zeichen darin nicht an.

Was ist der Unterschied zwischen XML und JSON?

Beide tragen Daten als Text, beantworten aber verschiedene Fragen. XML ist eine Auszeichnungssprache: Es umschließt Inhalte mit Tags, hängt Attribute daran, erlaubt Struktur mitten im Fließtext und kann über ein Schema förmlich festhalten, welche Felder ein Dokument enthalten muss — nützlich überall dort, wo ein Dokument rechtlich zählt, etwa bei Rechnungs- und Bankformaten. JSON ist eine Notation für Datenstrukturen: Objekte, Arrays, Zahlen, Zeichenketten und Wahrheitswerte, ohne den Begriff des Attributs und mit weniger Beiwerk um denselben Inhalt. Webdienste sind wegen dieser Schlichtheit zu JSON gewechselt, denn nahezu jede Sprache liest es mit einem einzigen Aufruf. Die Schwierigkeit der Umwandlung stammt genau aus dieser Asymmetrie: Für Attribute und wiederholte Tags gibt es in JSON keine direkte Entsprechung, weshalb Regeln wie das @-Präfix und das Sammeln in Arrays erfunden werden müssen.

Die Umwandlungsregeln

Die Datenmodelle von XML und JSON decken sich nicht eins zu eins, deshalb muss jeder Konverter seine eigenen Regeln offenlegen und sich daran halten. Hier gelten diese:

  • Attribut → Schlüssel '@name': aus <artikel nr="SKU-11"> wird das Feld '@nr'
  • Element mit reinem Text → eine Zeichenkette: aus <kunde>Jörg</kunde> wird 'Jörg'
  • Text und zusätzlich Attribute oder Kindelemente → der Text wandert unter '#text'
  • Gleichnamige Geschwisterelemente → ein Array in der Reihenfolge des Dokuments
  • Leeres Element (<hinweis/>) → eine leere Zeichenkette
  • CDATA wird wörtlich übernommen; Kommentare und die <?xml?>-Deklaration entfallen

Ein Element oder ein Array: die Falle, die Sie kennen sollten

Entschieden wird durch Zählen. Ein Element, das zweimal vorkommt, wird zum Array; eines, das einmal vorkommt, wird zum Objekt. XML selbst kann nicht sagen "an dieser Stelle steht immer eine Liste" — diese Auskunft steht in einem Schema (XSD), und ein Schema wird hier nicht gelesen.

Praktisch heißt das: Zwei Dokumente derselben Bauart können unterschiedliches JSON ergeben. Eine Bestellung mit einem Artikel liefert ein Objekt, dieselbe Bestellung mit zwei Artikeln ein Array. Wenn Programmcode die Ausgabe weiterverarbeitet, prüfen Sie das Feld auf ein Array, bevor Sie darüber laufen. Das ist der mit Abstand häufigste Fehler in Systemen, die von XML auf JSON umsteigen.

Grenzen des Umfangs: Namensräume, DTD und Entities

Der Parser ist klein, von Hand geschrieben und läuft in Ihrem Browser. Sein Umfang ist bewusst eng, und die Grenzen stehen hier, statt mitten in der Arbeit entdeckt zu werden:

  • Namensräume werden nicht aufgelöst: 'ns:tag' behält das Präfix als Teil des Schlüssels, xmlns-Attribute gelten als gewöhnliche Attribute
  • DTD und <!DOCTYPE> werden übersprungen, dort definierte eigene Entities also nicht aufgelöst
  • Aufgelöst werden nur &amp; &lt; &gt; &quot; &apos; sowie numerische Verweise der Form &#NNN; und &#xNN;; ein unbekanntes Entity bleibt als Text stehen
  • Es findet keine Schemaprüfung (XSD) statt — geprüft wird allein, ob das Dokument wohlgeformt ist

Warum die Entity-Auflösung abgeschaltet ist

Entities, die in einer DTD definiert sind, dürfen sich gegenseitig aufrufen. Zehn Zeilen solcher Definitionen können sich zu Gigabytes an Text entfalten; das ist der klassische Erschöpfungsangriff, bekannt als Entity-Bombe oder Billion Laughs. Ein Parser, der Entities bereitwillig auflöst, legt beim Verarbeiten eines solchen Dokuments den Tab lahm.

Weil diese Umwandlung auf Ihrem eigenen Rechner läuft, träfe der Preis dafür Sie. Deshalb bleibt die Auflösung auf die fünf vordefinierten Kürzel und numerische Verweise beschränkt, und nichts, was eine externe Quelle liest oder sich rekursiv entfaltet, wird überhaupt verarbeitet.

Häufige Fragen

Warum beginnen Attribute mit @?

Weil ein Element gleichzeitig ein Attribut namens 'nr' und ein Kindelement namens 'nr' tragen kann; in JSON fielen beide auf denselben Schlüssel und eines ginge verloren. Das @ vor dem Attributnamen verhindert diesen Zusammenstoß und ist die verbreitete Konvention für diese Umwandlung.

Warum ergibt dieselbe Dokumentform eine andere Struktur?

Die Struktur richtet sich nach den Daten: Ein einmal vorkommendes Element wird zum Objekt, ein zwei- oder mehrfach vorkommendes zum Array. Sollen Listen immer Arrays sein, prüfen Sie das Feld auf der verarbeitenden Seite vor dem Auslesen.

Funktionieren Tags mit Namensraum-Präfix (ns:tag)?

Sie werden gelesen und umgewandelt, der Namensraum wird jedoch nicht aufgelöst: Das Präfix bleibt Teil des Schlüssels, aus 'ns:tag' wird also auch im JSON 'ns:tag'. Auch xmlns-Attribute verschwinden nicht, sie erscheinen als Felder mit dem Namen '@xmlns'.

Wird das eingefügte XML irgendwohin gesendet?

Nein. Auswertung und Umwandlung laufen vollständig in Ihrem Browser, eine Rechnung, eine Bestellung oder eine Konfigurationsdatei bleibt also auf dieser Seite und erreicht keinen Server.