Vai al contenuto
jsonbeautifiers
Italiano

XML in JSON

Attributi, CDATA ed entità gestiti, e i tag non corrispondenti indicati con precisione.

XML
JSON

Nulla di ciò che incolli lascia il tuo browser. L’allowlist connect-src ne fa una garanzia del browser anziché una promessa. Verificalo tu stesso

Converti XML in JSON, con attributi, sezioni CDATA e riferimenti a entità gestiti, e l’XML malformato segnalato con precisione anziché in modo generico.

L’XML porta più struttura di quanta il JSON possa contenerne, quindi questa direzione perde informazione in modi ben identificati. Ognuno viene segnalato nelle note quando riguarda il tuo documento.

Errori che indicano il problema vero

Il browser ha un parser XML integrato, ma il suo messaggio di errore è un frammento HTML localizzato che non si può leggere in modo affidabile. Questa pagina usa un parser proprio, così le diagnosi hanno la stessa qualità di quelle sul lato JSON.

Tag non corrispondenti
Indica sia il tag di chiusura sia l’elemento che avrebbe dovuto chiudere. L’XML annida in modo rigoroso, a differenza dell’HTML.
Elementi non chiusi
Elenca tutto ciò che era ancora aperto quando il documento è finito.
Un secondo elemento radice
Un documento XML ne ha esattamente uno. È un risultato tipico della concatenazione di due file.
Abitudini da HTML
Un attributo senza valore come checked, o un valore di attributo senza virgolette. Entrambi sono HTML legale e nessuno dei due è XML legale.
Commenti e CDATA non terminati
Segnalati nella posizione in cui la sezione è stata aperta.

Che cosa il JSON non può rappresentare

Contenuto misto
Un elemento con testo ed elementi figli insieme. Il JSON non ha modo di mantenere il testo ordinato rispetto ai figli, quindi il testo viene raccolto in un’unica chiave #text e la conversione lo dichiara.
L’ordine tra elementi con nomi diversi
I fratelli ripetuti diventano un array e mantengono l’ordine, ma l’ordine relativo tra fratelli con nomi diversi si perde, perché le chiavi di un oggetto JSON non hanno ordine.
Namespace
I prefissi restano come parte del nome; le dichiarazioni di namespace diventano attributi ordinari.
Un elemento contro molti
Una lista con un solo elemento diventa un valore singolo anziché un array da uno, che è la classica fonte di bug a valle. Attiva «usa sempre gli array» per evitarlo.

Tipi

L’XML è testo. Tutto è una stringa a meno che non attivi l’inferenza, e anche allora un valore che non sopravvivrebbe a un’andata e ritorno in float64 resta una stringa. È la stessa politica del convertitore CSV, e per lo stesso motivo.

How to do this in code

Convertire nel codice.

py Python
import xmltodict, json

data = xmltodict.parse(xml_text)
print(json.dumps(data, indent=2))

# force_list keeps single elements as arrays, which stops the
# classic "sometimes a list, sometimes an object" bug.
data = xmltodict.parse(xml_text, force_list={'item'})
js JavaScript
import { XMLParser } from 'fast-xml-parser';

const parser = new XMLParser({
  ignoreAttributes: false,
  attributeNamePrefix: '@',
  isArray: (name) => name === 'item',
});
const data = parser.parse(xmlText);
sh Shell
# xq, the XML front end to jq
xq . input.xml

# Or with Python, no extra install beyond xmltodict
python -c 'import sys,xmltodict,json; print(json.dumps(xmltodict.parse(sys.stdin.read()), indent=2))' < in.xml

Domande frequenti

Perché una delle mie liste non è un array?
Perché aveva esattamente un elemento, e un figlio singolo non si distingue da una lista da uno. Attiva «usa sempre gli array». Conviene ogni volta che l’output alimenta del codice anziché una persona, perché elimina un’intera classe di bug.
Che fine hanno fatto i miei namespace?
I prefissi sopravvivono come parte del nome della chiave e le dichiarazioni xmlns diventano attributi ordinari. Il JSON non ha il concetto di namespace, quindi la relazione semantica tra i due si perde.
Perché il mio HTML non viene analizzato?
L’HTML non è XML. Un <br> non chiuso, gli attributi senza valore e i valori senza virgolette sono tutti HTML legale e nessuno è XML legale. Per l’HTML ti serve un parser HTML, non questo.