XML vers JSON
Convertissez XML en JSON
Entrée XML
Sortie JSON
Qu'est-ce que la conversion XML vers JSON ?
La conversion XML vers JSON est le processus de transformation de données depuis le langage de balisage extensible (XML) vers la notation objet JavaScript (JSON). Les deux formats représentent des données structurées et hiérarchiques, mais utilisent des syntaxes et des modèles de données différents. XML utilise des balises ouvrantes et fermantes avec des attributs optionnels, tandis que JSON utilise des paires clé-valeur, des tableaux et des types primitifs. Convertir XML en JSON permet de travailler avec des données XML dans des environnements où JSON est le format natif, comme les environnements d'exécution JavaScript, les API REST et les bases de données NoSQL.
La conversion n'est pas toujours univoque. XML possède des constructs sans équivalent direct en JSON : les attributs, le contenu mixte (texte intercalé avec des éléments enfants), les instructions de traitement, les commentaires, les sections CDATA et les déclarations d'espaces de noms. Les différentes bibliothèques de conversion gèrent ces constructs différemment, ce qui explique l'existence de plusieurs conventions. L'approche la plus courante préfixe les noms d'attributs avec @ et place le contenu textuel dans un champ #text lorsque des attributs sont présents sur le même élément.
La conversion XML vers JSON est une étape fréquente lors de la migration de SOAP vers REST, de la consommation d'API d'entreprise héritées, ou du traitement de flux de données gouvernementaux et financiers imposant XML. Plutôt que de réécrire simultanément les producteurs et les consommateurs, les équipes convertissent la charge utile XML à la couche frontière et transmettent le JSON en aval. AWS API Gateway, Apache Camel et MuleSoft prennent tous en charge ce modèle nativement.
<bookstore>
<book category="fiction">
<title lang="en">The Great Gatsby</title>
<author>F. Scott Fitzgerald</author>
<year>1925</year>
<price>10.99</price>
</book>
<book category="non-fiction">
<title lang="en">Sapiens</title>
<author>Yuval Noah Harari</author>
<year>2011</year>
<price>14.99</price>
</book>
</bookstore>{
"bookstore": {
"book": [
{
"@category": "fiction",
"title": {
"@lang": "en",
"#text": "The Great Gatsby"
},
"author": "F. Scott Fitzgerald",
"year": "1925",
"price": "10.99"
},
{
"@category": "non-fiction",
"title": {
"@lang": "en",
"#text": "Sapiens"
},
"author": "Yuval Noah Harari",
"year": "2011",
"price": "14.99"
}
]
}
}Pourquoi utiliser un convertisseur XML vers JSON en ligne ?
Écrire un script de conversion ponctuel prend du temps, surtout lorsque le XML contient des attributs, des espaces de noms ou des éléments répétés qui doivent devenir des tableaux JSON. Un convertisseur dans le navigateur vous donne la sortie JSON en quelques secondes pour que vous puissiez inspecter la structure et avancer.
Cas d'utilisation de la conversion XML vers JSON
Référence de correspondance XML vers JSON
XML et JSON ont des modèles de données différents. Le tableau ci-dessous montre comment chaque construct XML correspond à son équivalent JSON selon la convention la plus courante (@ pour les attributs, #text pour le texte accompagné d'attributs). Certains constructs, comme le contenu mixte et les commentaires, n'ont pas de représentation JSON standard.
| Construct XML | Exemple XML | Équivalent JSON |
|---|---|---|
| Element | <name>text</name> | "name": "text" |
| Nested elements | <a><b>1</b></a> | "a": { "b": "1" } |
| Attributes | <el attr="v"/> | "el": { "@attr": "v" } |
| Text + attributes | <el a="1">text</el> | "el": { "@a": "1", "#text": "text" } |
| Repeated elements | <r><i>1</i><i>2</i></r> | "r": { "i": ["1", "2"] } |
| Mixed content | <p>A <b>B</b> C</p> | Varies by convention |
| CDATA | <![CDATA[raw]]> | "#cdata": "raw" or flattened |
| Namespaces | xmlns:prefix="uri" | Prefix preserved or stripped |
| Empty element | <el/> | "el": null or "" |
| Comments | <!-- note --> | Discarded (no JSON equivalent) |
Comparaison des conventions XML vers JSON
Il n'existe pas de norme unique régissant la correspondance de XML vers JSON. Trois conventions sont largement utilisées, chacune avec des compromis différents pour la gestion des attributs, la détection des tableaux et la préservation du texte.
Exemples de code
Voici des exemples fonctionnels pour convertir XML en JSON en JavaScript, Python, Go et en ligne de commande. Chaque exemple gère les éléments imbriqués et les balises frères répétées.
// Using the DOMParser API to walk XML and build a JSON object
function xmlToJson(xml) {
const parser = new DOMParser()
const doc = parser.parseFromString(xml, 'application/xml')
function nodeToObj(node) {
const obj = {}
// Handle attributes
if (node.attributes) {
for (const attr of node.attributes) {
obj['@' + attr.name] = attr.value
}
}
// Handle child nodes
for (const child of node.childNodes) {
if (child.nodeType === 3) { // text
const text = child.textContent.trim()
if (text) obj['#text'] = text
} else if (child.nodeType === 1) { // element
const key = child.nodeName
const val = nodeToObj(child)
if (obj[key]) {
if (!Array.isArray(obj[key])) obj[key] = [obj[key]]
obj[key].push(val)
} else {
obj[key] = val
}
}
}
// Simplify text-only nodes
const keys = Object.keys(obj)
if (keys.length === 1 && keys[0] === '#text') return obj['#text']
return obj
}
return nodeToObj(doc.documentElement)
}
const xml = '<user><name>Alice</name><role>admin</role></user>'
console.log(JSON.stringify(xmlToJson(xml), null, 2))
// → { "name": "Alice", "role": "admin" }import xmltodict
import json
xml = """
<user>
<name>Alice</name>
<roles>
<role>admin</role>
<role>editor</role>
</roles>
</user>
"""
# xmltodict converts XML to an OrderedDict
result = xmltodict.parse(xml)
print(json.dumps(result, indent=2))
# → {
# → "user": {
# → "name": "Alice",
# → "roles": { "role": ["admin", "editor"] }
# → }
# → }
# With the standard library (xml.etree.ElementTree)
import xml.etree.ElementTree as ET
def etree_to_dict(elem):
d = {}
if elem.attrib:
d.update({f"@{k}": v for k, v in elem.attrib.items()})
for child in elem:
child_data = etree_to_dict(child)
if child.tag in d:
if not isinstance(d[child.tag], list):
d[child.tag] = [d[child.tag]]
d[child.tag].append(child_data)
else:
d[child.tag] = child_data
if elem.text and elem.text.strip():
if d:
d["#text"] = elem.text.strip()
else:
return elem.text.strip()
return d
root = ET.fromstring(xml)
print(json.dumps(etree_to_dict(root), indent=2))package main
import (
"encoding/json"
"encoding/xml"
"fmt"
"strings"
)
// For simple, known schemas — define a struct
type User struct {
XMLName xml.Name `xml:"user"`
Name string `xml:"name"`
Roles []string `xml:"roles>role"`
}
func main() {
data := `<user><name>Alice</name><roles><role>admin</role><role>editor</role></roles></user>`
var user User
xml.NewDecoder(strings.NewReader(data)).Decode(&user)
out, _ := json.MarshalIndent(user, "", " ")
fmt.Println(string(out))
// → { "Name": "Alice", "Roles": ["admin", "editor"] }
}# Using xq (part of yq, a jq wrapper for XML)
# Install: pip install yq OR brew install yq
echo '<user><name>Alice</name></user>' | xq .
# → { "user": { "name": "Alice" } }
# Using xmlstarlet + jq
xmlstarlet sel -t -v '//name' input.xml | jq -R '{ name: . }'
# Node.js one-liner with xml2js
echo '<a><b>1</b></a>' | node -e "
const {parseString} = require('xml2js');
let d=''; process.stdin.on('data',c=>d+=c);
process.stdin.on('end',()=>parseString(d,(e,r)=>console.log(JSON.stringify(r,null,2))))
"