Aller au contenu
jsonbeautifiers
Français

XML en JSON

Attributs, CDATA et entités gérés, et les balises mal fermées nommées avec précision.

XML
JSON

Rien de ce que vous collez ne quitte votre navigateur. La liste d’autorisation connect-src en fait une garantie du navigateur plutôt qu’une promesse. Vérifiez-le vous-même

Convertissez du XML en JSON, avec la prise en charge des attributs, des sections CDATA et des références d’entités, et un XML malformé signalé précisément plutôt que de façon générique.

Le XML porte plus de structure que le JSON ne peut en contenir : ce sens de conversion perd donc de l’information, de façons nommées. Chacune est signalée dans les notes quand elle s’applique à votre document.

Des erreurs qui nomment le vrai problème

Le navigateur embarque un analyseur XML, mais son rapport d’erreur est un fragment HTML localisé qu’on ne peut pas lire de façon fiable. Cette page utilise son propre analyseur afin que les diagnostics soient à la hauteur de ceux du côté JSON.

Balises non concordantes
Nomme à la fois la balise fermante et l’élément qu’elle aurait dû fermer. Le XML s’imbrique strictement, contrairement au HTML.
Éléments non fermés
Liste tout ce qui restait ouvert à la fin du document.
Un second élément racine
Un document XML en a exactement un. C’est souvent le résultat de la concaténation de deux fichiers.
Habitudes HTML
Un attribut sans valeur comme checked, ou une valeur d’attribut sans guillemets. Les deux sont du HTML légal et aucun n’est du XML légal.
Commentaires et CDATA non terminés
Signalés à la position où la section s’est ouverte.

Ce que JSON ne peut pas représenter

Contenu mixte
Un élément contenant à la fois du texte et des éléments enfants. JSON n’a aucun moyen de garder le texte ordonné par rapport aux enfants : le texte est donc rassemblé dans une unique clé #text, et la conversion le signale.
L’ordre entre éléments de noms différents
Des frères répétés deviennent un tableau et gardent leur ordre, mais l’ordre relatif de frères portant des noms différents est perdu, car les clés d’un objet JSON ne portent aucun ordre.
Espaces de noms
Les préfixes sont conservés dans le nom ; les déclarations d’espace de noms deviennent de simples attributs.
Un élément contre plusieurs
Une liste à un seul élément devient une valeur seule au lieu d’un tableau d’un élément, source classique de bugs en aval. Activez « toujours utiliser des tableaux » pour l’éviter.

Types

Le XML est du texte. Tout est une chaîne, sauf si vous activez l’inférence, et même alors une valeur qui ne survivrait pas à un aller-retour en float64 reste une chaîne. C’est la même règle que pour le convertisseur CSV, et pour la même raison.

How to do this in code

Convertir en code.

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

Questions fréquentes

Pourquoi une de mes listes n’est-elle pas un tableau ?
Parce qu’elle comptait exactement un élément, et qu’un enfant unique ne se distingue pas d’une liste d’un. Activez « toujours utiliser des tableaux ». Cela vaut la peine dès que la sortie alimente du code plutôt qu’un humain, car cela supprime toute une classe de bugs.
Que sont devenus mes espaces de noms ?
Les préfixes survivent dans le nom de la clé et les déclarations xmlns deviennent de simples attributs. JSON n’a pas de notion d’espace de noms, la relation sémantique entre les deux est donc perdue.
Pourquoi mon HTML ne s’analyse-t-il pas ?
Le HTML n’est pas du XML. Un <br> non fermé, des attributs sans valeur et des valeurs sans guillemets sont tous du HTML légal et aucun n’est du XML légal. Pour du HTML il vous faut un analyseur HTML, pas celui-ci.