XML a JSON
Convierte XML a formato JSON
Entrada XML
Salida JSON
¿Qué es la conversión de XML a JSON?
La conversión de XML a JSON es el proceso de transformar datos del Lenguaje de Marcado Extensible (XML) a la Notación de Objetos de JavaScript (JSON). Ambos formatos representan datos estructurados y jerárquicos, pero utilizan sintaxis y modelos de datos distintos. XML usa etiquetas de apertura y cierre con atributos opcionales, mientras que JSON usa pares clave-valor, matrices y tipos primitivos. Convertir XML a JSON te permite trabajar con datos XML en entornos donde JSON es el formato nativo, como los runtimes de JavaScript, las APIs REST y las bases de datos NoSQL.
La conversión no siempre es uno a uno. XML tiene construcciones sin equivalente directo en JSON: atributos, contenido mixto (texto entremezclado con elementos hijo), instrucciones de procesamiento, comentarios, secciones CDATA y declaraciones de espacio de nombres. Las distintas bibliotecas de conversión gestionan estas construcciones de manera diferente, lo que explica la existencia de múltiples convenciones. El enfoque más habitual añade el prefijo @ a los nombres de atributos y coloca el contenido de texto en un campo #text cuando hay atributos presentes en el mismo elemento.
La conversión de XML a JSON es un paso habitual al migrar de SOAP a REST, al consumir APIs empresariales heredadas, o al procesar feeds de datos gubernamentales y financieros que exigen XML. En lugar de reescribir productores y consumidores simultáneamente, los equipos convierten el payload XML en la capa de frontera y pasan JSON hacia abajo. AWS API Gateway, Apache Camel y MuleSoft soportan este patrón de forma nativa.
<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"
}
]
}
}¿Por qué usar un conversor de XML a JSON online?
Escribir un script de conversión puntual lleva tiempo, especialmente cuando el XML contiene atributos, espacios de nombres o elementos repetidos que deben convertirse en matrices JSON. Un conversor en el navegador te da el resultado en segundos para que puedas inspeccionar la estructura y continuar.
Casos de uso de XML a JSON
Referencia de correspondencia XML a JSON
XML y JSON tienen modelos de datos distintos. La tabla siguiente muestra cómo se corresponde cada construcción XML con su equivalente JSON bajo la convención más común (@ para atributos, #text para texto junto a atributos). Algunas construcciones, como el contenido mixto y los comentarios, no tienen representación JSON estándar.
| Construcción XML | Ejemplo XML | Equivalente 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) |
Convenciones de XML a JSON comparadas
No existe un estándar único que rija la correspondencia de XML a JSON. Se usan ampliamente tres convenciones, cada una con diferentes ventajas e inconvenientes en cuanto al tratamiento de atributos, la detección de matrices y la preservación del texto.
Ejemplos de código
A continuación hay ejemplos funcionales para convertir XML a JSON en JavaScript, Python, Go y la línea de comandos. Cada ejemplo gestiona elementos anidados y etiquetas hermanas repetidas.
// 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))))
"