XML in JSON und zurück
Füge XML ein oder lade eine XML-Datei und erhalte das passende JSON, oder geh den umgekehrten Weg. Ist das XML fehlerhaft, nennen wir dir die Zeile, die Spalte und die verletzte Regel.
Oder ziehe eine .xml- oder .json-Datei hierher oder tippe, um eine auszuwählen
So liest du die Umwandlung
Ein XML-Element wird zu einem JSON-Objekt. Attribute bekommen das Präfix @: Aus <price currency="EUR">12.90</price> wird {"@currency":"EUR","#text":"12.90"}. Ein Element nur mit Text und ohne Attribute wird zur Zeichenkette selbst, und ein leeres Element wird zu null. Geschwisterelemente mit gleichem Namen werden zu einer Liste, und das Wurzelelement bleibt als einziger Schlüssel ganz oben. Kollisionen sind mit dieser Konvention ausgeschlossen, weil At-Zeichen und Raute in einem XML-Namen nicht erlaubt sind: Kein Element wird je #text heißen.
Die Falle mit der Liste aus nur einem Element
Das ist die Falle, die im Produktivbetrieb zuschlägt. Kommen im Feed drei Elemente vom Typ <row> vor, bekommst du eine Liste, enthält derselbe Feed aber nur eines, bekommst du ein Objekt, und der Code, der über die Liste läuft, bricht bei einer Datei ab, die identisch aussah. Kein Konverter kann das allein aus dem XML erraten, denn die Kardinalität steht im Schema (XSD), nicht in den Daten. Genau deshalb gibt es das Kästchen, das Kindelemente immer in eine Liste setzt: Schalte es ein, wenn ein Programm das JSON liest, und lass es aus, wenn du JSON willst, das sich angenehm lesen lässt.
Was nicht ins JSON kommt
Kommentare und Verarbeitungsanweisungen werden weggelassen, weil JSON keinen Platz dafür hat, und die Seite weist mit einer Warnung darauf hin, statt sie stillschweigend zu verwerfen. CDATA-Abschnitte werden zu normalem Text. Der DOCTYPE wird übersprungen, in einer DTD deklarierte Entitäten werden also nicht aufgelöst: Taucht eine auf, stoppt das Tool und nennt sie. Namespace-Präfixe bleiben wörtlich erhalten (soap:Envelope bleibt soap:Envelope), URIs werden nicht aufgelöst. Leerraum am Anfang und Ende des Textes eines Elements wird entfernt.
Warum der Fehler eine Zeile und eine Spalte nennt
Geparst wird mit einem eigens für diese Seite geschriebenen Parser, nicht mit dem XML-Parser des Browsers, der in Chrome, Firefox und Safari unterschiedliche Meldungen ausgibt. So bekommst du die genaue Stelle und die verletzte Regel: In XML sind Anführungszeichen um Attributwerte Pflicht, Tags werden in der umgekehrten Reihenfolge ihres Öffnens geschlossen, es darf nur ein Wurzelelement geben, und ein einzelnes kaufmännisches Und muss als & geschrieben werden. Diese vier Regeln stecken hinter fast jedem abgelehnten Export. Ist die Datei dagegen YAML (das Format, das auf Einrückung beruht), gibt es das Tool YAML in JSON.
Von JSON zurück zu XML und die Kodierung der Dateien
In umgekehrter Richtung werden Schlüssel zu Elementen, Schlüssel mit At-Zeichen zu Attributen, #text wird zum Text, und Listen werden zu wiederholten Elementen. Kann ein Schlüssel kein gültiger XML-Name sein (er beginnt mit einer Ziffer oder enthält ein Leerzeichen), stoppt das Tool und nennt ihn, statt ihn zu verstümmeln. Sonderzeichen werden im Text und in Attributwerten gleichermaßen maskiert. Lädst du eine Datei, die eine andere Kodierung als UTF-8 deklariert, zum Beispiel ISO-8859-1, wird sie mit dieser Kodierung neu gelesen, und das Ergebnis ist immer UTF-8. Alles läuft im Browser, nichts wird an einen Server gesendet.