XML en JSON
Attributs, CDATA et entités gérés, et les balises mal fermées nommées avec précision.
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.