← Todos los artículos

JSON a XML: elementos raíz, arrays y mapeo de atributos

Convierte JSON a XML: elegir un elemento raíz, mapear claves con prefijo @ a atributos, transformar arrays en elementos repetidos y escapar — en JS, Python y online.

Convertir JSON a XML es la operación inversa de un mapeo con pérdida, lo que implica que tendrás que tomar decisiones que JSON nunca te obligó a tomar: ¿cuál es el elemento raíz? ¿Esta clave se convierte en atributo o en elemento hijo? ¿Cómo se convierte un array JSON en etiquetas XML repetidas? Esta guía cubre las convenciones para JSON a XML —— elementos raíz, arrays, atributos y escape —— en JavaScript, Python y el navegador.

Elegir un elemento raíz

XML exige exactamente un elemento raíz; JSON no tiene esa regla. La primera decisión es qué envuelve todo lo demás. Si tu JSON es un objeto con una única clave de nivel superior, esa clave es la raíz natural:

{ "note": { "to": "Ada", "from": "Bob" } }

<note>
  <to>Ada</to>
  <from>Bob</from>
</note>

Si el JSON tiene varias claves de nivel superior (o es un array), no hay raíz única, así que los conversores envuelven todo con un elemento sintético como <root>:

{ "to": "Ada", "from": "Bob" }

<root>
  <to>Ada</to>
  <from>Bob</from>
</root>

Atributos a partir de claves con prefijo @

Para hacer ida y vuelta con la convención XML a JSON, las claves que empiezan con @ se emiten como atributos en vez de como elementos hijo, y la clave #text se convierte en el contenido textual del elemento:

{
  "price": { "@currency": "USD", "#text": "9.99" }
}

<price currency="USD">9.99</price>

Si no usas esta convención, cada valor se convierte en un elemento hijo —— válido, sólo más verboso. La convención @/#text es lo que hace que XML → JSON → XML sea sin pérdida.

Los arrays se convierten en elementos repetidos

Un array JSON no se convierte en un único elemento con varios valores —— se convierte en el mismo elemento repetido, porque así representa XML una lista:

{ "tags": { "tag": ["a", "b", "c"] } }

<tags>
  <tag>a</tag>
  <tag>b</tag>
  <tag>c</tag>
</tags>

Una consecuencia sutil: un array de objetos de nivel superior no puede ser la raíz (produciría varios elementos raíz), así que debe envolverse —— habitualmente como <root> que contiene <item> repetidos.

Valores sin mapeo limpio

  • Booleanos y números —— XML no tiene tipos, así que true y 42 se escriben como el texto true y 42.
  • null —— habitualmente un elemento vacío/autocerrado: <middleName/>.
  • Claves que no son nombres de elemento válidos —— los nombres no pueden empezar por dígito ni contener espacios. "1st place" no es una etiqueta legal y debe sanearse o producirá XML inválido.

Escape y declaración

Los valores de texto y atributo deben escapar &, < y > (además de " dentro de atributos). Un conversor también debería anteponer la declaración XML para que la salida sea un documento completo:

<?xml version="1.0" encoding="UTF-8"?>
<message>B &amp; C are &lt; D</message>

Apuntar a un XSD o producir xmlns

Si tu consumidor valida el XML contra un XSD (XML Schema), la conversión tiene que hacer alguna cosa extra además del mapeo clave→elemento:

  • El orden de los elementos importa. Los atributos XML de un elemento no tienen orden (según la spec), pero los elementos hijos sí lo tienen y la mayoría de XSD lo imponen con xsd:sequence. Emite los hijos en el orden que el esquema espera, no en el orden de iteración de claves del objeto, o la validación fallará.
  • Mapeo de namespaces. Recrea las declaraciones xmlns como atributos @xmlns en la raíz y refleja los nombres con prefijo de vuelta en el XML ("soap:Envelope"<soap:Envelope>). Un conversor que descarte namespaces producirá XML que no validará contra ningún XSD que los requiera.
  • Valores conscientes del tipo. XML no tiene tipos nativos, así que un XSD con xsd:int o xsd:date simplemente comprueba que el contenido textual encaje. Formatea el valor JSON como texto con el patrón que el XSD espera (fecha ISO, entero como cadena, etc.).

Cómo convertir JSON a XML en código

// JavaScript —— un pequeño constructor recursivo, o una librería:
import { XMLBuilder } from 'fast-xml-parser';
const builder = new XMLBuilder({ ignoreAttributes: false, attributeNamePrefix: '@' });
const xml = builder.build(jsonObject);

# Python —— dicttoxml, o construir con xml.etree.ElementTree
from dicttoxml import dicttoxml
xml_bytes = dicttoxml({"note": {"to": "Ada"}}, attr_type=False)

Convertir JSON a XML en línea

Pega tu JSON en el conversor JSON ⇄ XML y haz clic en To XML. Elige una raíz sensata, mapea las claves @ a atributos, repite elementos para los arrays y escapa los caracteres especiales —— todo en tu navegador. Si tu JSON tiene errores de sintaxis, se repara primero; también puedes limpiarlo con JSON Fix.

Preguntas frecuentes

¿Cómo convierto JSON a XML?

Elige un elemento raíz (una única clave de nivel superior, o un <root> sintético), y convierte recursivamente las claves en elementos hijo, las claves con prefijo @ en atributos y los arrays en elementos repetidos —— escapando &, < y > en el texto.

¿Cómo se convierte un array JSON en XML?

Cada elemento del array se convierte en un elemento separado con el mismo nombre de etiqueta, porque XML representa las listas como elementos repetidos en vez de un único nodo multivaluado.

¿Cómo hago que un valor JSON sea un atributo XML?

Prefíjale a la clave con @ (p. ej. "@id") y pon el texto del elemento bajo #text. Esto coincide con la convención estándar XML a JSON, así que la conversión es reversible.

¿Qué pasa si una clave JSON no es un nombre de elemento XML válido?

Los nombres de etiqueta XML no pueden empezar por dígito ni contener espacios, así que claves como "1st place" deben sanearse (p. ej. a _1st_place) o la salida no será XML bien formado.

Herramientas y guías relacionadas