Conversor de XML a JSON
¿Qué es la conversión de XML a JSON?
XML to JSON convierte marcado XML en una estructura JSON para manejar datos con más facilidad en JavaScript, APIs, herramientas no-code o pipelines modernos. El mapeo no siempre es evidente porque XML tiene elementos, atributos, nodos de texto, espacios de nombres, orden y nodos repetidos, mientras JSON usa objetos, arrays y valores simples. La herramienta es útil para integraciones legacy, respuestas SOAP, sitemaps, feeds RSS, configuraciones y datos de prueba. En interfaces productivas deben revisarse atributos, elementos vacíos, contenido mixto, namespaces y detección de arrays. Que el JSON se parse correctamente no significa automáticamente que toda la información de negocio se preservó con la forma esperada.
Cómo usar
Cómo usar
- Pega o introduce datos XML en el cuadro de entrada izquierdo
- Selecciona el tamaño de sangría (2 espacios, 4 espacios o Tab)
- El JSON convertido se muestra a la derecha con resaltado de sintaxis
- Revisa el resultado de la conversión y corrige cualquier error en el XML
- Haz clic en Copiar o Descargar para guardar el resultado
Notas sobre la estructura de datos
- Los atributos XML, nodos repetidos, espacios de nombres y texto mixto pueden mapearse a JSON de varias maneras válidas; inspecciona la estructura generada antes de usarla.
- Para migraciones de API, define una regla de mapeo de campos en lugar de depender de una única conversión de muestra.
Casos de uso
Principio técnico
La conversión comienza con el parser XML integrado del navegador. `new DOMParser().parseFromString(xmlString, 'application/xml')` devuelve un `Document` que sigue W3C DOM Level 3 Core, valida la correcta formación según XML 1.0 (Quinta Edición) y expone el resultado como un árbol de nodos `Element`, `Attr`, `Text`, `CDATASection` y `Comment`. Si la entrada está mal formada, el parser no lanza una excepción, sino que devuelve un documento cuyo elemento raíz es `<parsererror>` con la ubicación y el motivo, por lo que el conversor comprueba `doc.querySelector('parsererror')` primero y muestra ese mensaje en lugar de producir JSON parcial. El mapeo del árbol a JSON recorre el documento en profundidad y sigue una convención de estilo Badgerfish. Cada elemento se convierte en una propiedad cuya clave es el nombre local; los elementos hijos se convierten en objetos anidados; los atributos de los elementos se aplanan con un prefijo `@` (por ejemplo, `<user id="7">` → `{ "user": { "@id": "7" } }`); el contenido de texto junto a elementos hijos se almacena bajo `#text`. Los elementos hermanos repetidos con el mismo nombre se pliegan en un array JSON: dos nodos `<item>` se convierten en `"item": [ ... ]`, pero un único `<item>` permanece como objeto simple; esta es la conocida ambigüedad de "uno vs. varios", porque XML no puede distinguir una lista de un elemento de un valor escalar mientras que JSON trata `"item": {...}` y `"item": [{...}]` como formas distintas. Varias características de XML no tienen un equivalente limpio en JSON y son intencionalmente con pérdida. El orden de elementos lo preserva XML pero no está garantizado por el orden de claves de objetos JSON en todos los consumidores (aunque ES2015 especifica el orden de inserción para claves de cadena, esquemas como JSON Schema no lo restringen). El contenido mixto como `<p>Hola <b>mundo</b>!</p>` intercala texto con elementos y no puede hacer un ida-vuelta al modelo simple de clave-valor. Los namespaces XML en notación Clark (`{http://example.com/ns}user`) se reducen al nombre local `user`, que puede colisionar con un elemento sin namespace del mismo nombre. Los bloques CDATA como `<![CDATA[<raw>]]>` se desenvuelven en texto plano. Las instrucciones de procesamiento (`<?xml-stylesheet ...?>`), los comentarios (`<!-- ... -->`) y la declaración XML se descartan porque JSON no tiene sintaxis para ellos. La indentación se aplica mediante `JSON.stringify(value, null, indent)` con 2 espacios, 4 espacios o `'\t'`.
- Parser: `new DOMParser().parseFromString(xml, 'application/xml')` según W3C DOM Level 3 Core; los errores se presentan como un elemento raíz `<parsererror>`, no como una excepción lanzada.
- Convenciones de mapeo: `@attr` al estilo Badgerfish para atributos, `#text` para texto mixto, nombre local del elemento para hijos; Parker descarta atributos, Spark los mantiene en `$`.
- Los hijos repetidos con el mismo nombre se pliegan en un array JSON; un único hijo permanece como objeto: la ambigüedad clásica de "uno vs. varios" no tiene solución del lado XML.
- Características con pérdida: atributos (sin prefijo `@`), namespaces (`xmlns:foo`), instrucciones de procesamiento, comentarios, la declaración XML y envoltorios CDATA.
- El contenido mixto (`<p>Hola <b>mundo</b>!</p>`) no puede hacer un ida-vuelta a JSON de clave-valor; el orden de elementos puede perderse en consumidores que no preservan el orden de claves.
- La coerción a número/booleano es una elección deliberada: `<age>30</age>` puede convertirse en `30` (número) o `"30"` (cadena); los ceros a la izquierda (`007`) deben permanecer como cadenas.
- El formato de salida usa `JSON.stringify(value, null, indent)` con indentación de 2 espacios, 4 espacios o `'\t'`; el resultado es UTF-8 sin BOM.
Ejemplos
Elemento simple
<root>
<name>John</name>
</root>
→
{"root": {"name": "John"}}Elementos repetidos
<root>
<item>A</item>
<item>B</item>
</root>
→
{"root": {"item": ["A", "B"]}}Estructura anidada
<root>
<user>
<name>John</name>
<age>30</age>
</user>
</root>
→
{"root": {"user": {"name": "John", "age": 30}}}Preguntas frecuentes
¿Cómo se mapean los elementos XML a JSON?
Cada elemento se convierte en una propiedad JSON cuyo valor es el contenido del elemento (string u objeto anidado). Los elementos repetidos con el mismo nombre se convierten en arrays. Los atributos suelen llevar el prefijo '@' o se almacenan bajo una clave especial como '$'. La convención exacta varía y es configurable en la mayoría de páginas.
¿Por qué la conversión XML-a-JSON a veces pierde información?
XML distingue entre elementos, atributos, contenido textual, contenido mixto (texto y elementos), espacios de nombres, instrucciones de procesamiento y comentarios. JSON solo tiene objetos, arrays, strings, números, booleanos y null. Mapear el árbol más rico de XML sobre JSON pierde información sobre el orden y sobre la distinción entre elemento y atributo.
¿Cómo se gestionan los elementos con contenido mixto (texto + elementos hijos)?
Hola mundo!
no tiene una representación JSON limpia. La página suele usar una clave especial (como '#text' o '$') para capturar el texto suelto, pero el orden entre texto y elementos no siempre se preserva. Evita el contenido mixto si planeas un ciclo de ida y vuelta.¿Y los espacios de nombres XML?
Los elementos con prefijo (<ns:foo>) se convierten en claves de string 'ns:foo' o se separan en propiedades ns y de nombre local. Las declaraciones xmlns pueden conservarse como propiedades de tipo atributo o descartarse, según la configuración de la página.
¿Puedo recuperar XML idéntico a partir del JSON?
El ciclo de ida y vuelta no es sin pérdidas en general, sobre todo con contenido mixto, comentarios, instrucciones de procesamiento y orden de atributos. Para XML solo de datos (configuración, registros simples), el ciclo suele funcionar. Para XML de tipo documento (DocBook, HTML, RSS), usa un parser XML real.
¿Es lo mismo el elemento vacío <foo/> que <foo></foo>?
Sí, para el parser. Ambos producen una propiedad foo con un string vacío o valor null. La sintaxis autocerrada es puramente cosmética en XML.
¿La conversión es local?
Sí. El parseo de XML y la generación de JSON ocurren en tu navegador. La página no sube tus datos.