Convertissez des documents XML en JSON dans votre navigateur. Conservez les attributs sous des clés préfixées par @, regroupez les éléments répétés en tableaux et coerciez éventuellement les nombres, booléens et null.
Lisez le XML comme l'arbre d'objets qu'il a toujours voulu être. Collez un document XML et récupérez du JSON. Les attributs sont conservés sous des clés préfixées par @, les éléments répétés se regroupent en tableaux, et la coercition de type est optionnelle afin que les identifiants gardent leurs zéros initiaux.
Sortie JSON
Les trois problèmes que tout convertisseur XML vers JSON doit résoudre
Les attributs n'ont nulle part où aller naturellement
Le XML trace une frontière nette entre attributs et éléments enfants. <user id="7"><name>Ada</name></user> dit quelque chose de différent de <user><id>7</id><name>Ada</name></user>, même si la plupart des applications les traitent identiquement. Le JSON n'a pas de distinction équivalente, aussi un convertisseur doit-il soit abandonner les attributs, soit inventer une place pour eux.
La convention largement utilisée, et celle appliquée ici, préfixe les clés d'attribut par @ et stocke le texte de l'élément sous #text lorsqu'un élément a à la fois des attributs et du contenu. Ainsi le premier exemple devient {"user": {"@id": "7", "name": "Ada"}}. Le préfixe ne fait partie d'aucune norme, mais il est suffisamment courant pour que la plupart du code en aval le reconnaisse, et il garde la conversion réversible. Désactiver les attributs produit une sortie plus propre quand vous savez que les attributs sont des métadonnées dont vous n'avez pas besoin.
Un élément ou une liste d'un élément ?
C'est le problème sans réponse correcte. En XML, un parent avec un seul enfant <item> et un parent avec cinq se ressemblent structurellement, mais ils doivent devenir respectivement un objet unique et un tableau — et rien dans le document n'indique ce que le schéma avait prévu. Un outil sans schéma doit deviner d'après ce qu'il voit.
La règle ici est de regrouper les noms d'éléments frères répétés en un tableau et de laisser un élément isolé comme une valeur unique. Cela correspond à l'intuition à la lecture, mais cela signifie que le code consommant la sortie doit gérer les deux formes, car une liste qui compte par hasard une entrée aujourd'hui produira un objet plutôt qu'un tableau à un élément. Lorsque vous contrôlez le consommateur, normalisez avec quelque chose comme [].concat(value) avant d'itérer.
Tout dans le XML est une chaîne
Il n'y a aucun type dans un document XML sans schéma. <count>42</count> et <sku>0042</sku> sont tous deux de simples textes, et seul un humain ou un XSD sait que l'un est un nombre et l'autre un identifiant qui doit garder ses zéros.
C'est pourquoi la coercition de type est une case à cocher plutôt que le défaut. Lorsqu'elle est activée, les valeurs ne sont converties que lorsque l'aller-retour est exact — une chaîne numérique ne devient un nombre que si la reformater produit un texte identique, ce qui protège 0042, +7 et 1e999. true, false et les éléments vides deviennent des booléens et null. Lorsqu'elle est désactivée, chaque valeur reste une chaîne, ce qui est le choix le plus sûr pour les identifiants, numéros de téléphone, codes postaux et tout entier au-delà de 2^53 où la précision des nombres JavaScript corromprait silencieusement la valeur.
FAQ
Mon XML est-il téléversé quelque part ?
Non. L'analyse utilise le DOMParser intégré au navigateur et le JSON est produit localement, si bien que le document ne quitte jamais la page.
Comment les attributs sont-ils représentés ?
Sous la forme de clés préfixées par @, à côté des enfants de l'élément. Si un élément a à la fois des attributs et du texte, le texte est stocké sous une clé #text.
Pourquoi un élément unique n'est-il pas devenu un tableau ?
Sans schéma, rien n'indique si un enfant unique signifie une valeur unique ou une liste d'un élément. Les noms répétés deviennent des tableaux ; un élément isolé reste une valeur unique.
Que fait la coercition de type ?
Elle convertit les valeurs numériques, booléennes et vides depuis le texte. Les nombres ne sont convertis que lorsque l'aller-retour est exact, si bien que 0042 et +7 restent des chaînes.
Dois-je laisser la coercition désactivée ?
Oui pour les identifiants, numéros de téléphone, codes postaux et entiers au-delà de 2^53, où la précision des nombres de JavaScript arrondirait la valeur sans avertissement.
Pourquoi obtient-on une erreur XML invalide ?
Le document n'est pas bien formé : balises non fermées ou mal appariées, un & ou < non échappé, ou plus d'un élément racine sont les causes habituelles.