XML to JSON Converter
Free browser-based XML to JSON converter — no sign-up, no upload required. Maps XML attributes to @keys, nests elements, and turns repeated tags into arrays, entirely client-side.
Actualizado
Preguntas Frecuentes
How is an element that has both an attribute and text content converted, like <price currency="USD">19.99</price>?
The attribute forces the element to become a JSON object rather than a plain string, since a plain string value has nowhere to hang the attribute. The text content moves to a #text key alongside the attribute key: {"price": {"@currency": "USD", "#text": "19.99"}}. If the element had no attributes, the same tag would have simplified to a plain string value instead.
What happens to an empty element like <note/> or <note></note>?
Per the XML 1.0 spec, a self-closing tag and an explicitly-closed empty tag are equivalent — there's no way to distinguish them once parsed, so both convert identically. With no attributes and no text or child content, there's nothing to populate the JSON value with, so this typically comes through as an empty string or null rather than an empty object, since there are no attribute or child keys to place inside one.
Are XML comments and processing instructions kept in the JSON output?
No. JSON's grammar (RFC 8259 / ECMA-404) has no comment syntax and no node type analogous to a processing instruction (<?xml-stylesheet type="text/xsl" href="style.xsl"?>), so both are stripped during conversion. Only element structure, attributes, and character data survive the conversion; anything that isn't data in the XML infoset sense is discarded.
Why might converting XML to JSON and back produce a file with different whitespace or attribute order than the original?
Two separate spec gaps compound here. First, XML often contains whitespace-only text nodes between elements purely for pretty-printing indentation, which can surface as stray #text entries unless explicitly stripped. Second, the JSON grammar (ECMA-404) never mandates that object members preserve insertion order — most parsers do in practice, but it isn't a spec guarantee — so attribute order captured as @keys isn't reliably round-trippable either.
Si convierto <id>007</id> a JSON, ¿el valor se convierte en el número 7 o se mantiene como la cadena "007"?
Esta es una ambigüedad inherente, no un fallo de ninguna herramienta en particular. XML no tiene un tipo numérico o booleano nativo — según la especificación XML 1.0, el contenido de todo elemento es siempre character data — así que una conversión de XML a JSON siempre tiene que tomar una decisión sobre cuándo un texto debe convertirse en un número/booleano JSON y cuándo debe permanecer como cadena. Esa decisión es realmente peligrosa para valores como "007" (un código postal o de producto, no el número 7) o "1.50" (un precio, donde convertirlo a número elimina silenciosamente el cero final y lo deja en 1.5). El comportamiento por defecto más seguro, y el que favorecen la mayoría de las conversiones, es dejar todos los valores de elementos y atributos como cadenas JSON y dejar que el código consumidor decida cuándo y cómo convertirlos — así no se destruye ninguna información de forma silenciosa.
¿Por qué los desarrolladores convierten las respuestas de APIs XML a JSON en lugar de parsear el XML directamente en JavaScript?
Los navegadores y Node.js no tienen ningún equivalente integrado a JSON.parse para XML — necesitarías usar DOMParser (solo en el navegador) o una librería XML (en Node), y luego escribir a mano el código de recorrido para extraer valores del árbol DOM mediante getElementsByTagName o XPath. JSON.parse, en cambio, es una única llamada integrada que te entrega objetos y arrays planos que puedes desestructurar de inmediato. Esa diferencia explica exactamente por qué las APIs SOAP heredadas, los feeds RSS/Atom y los archivos sitemap.xml se convierten tan a menudo a JSON en el borde de una base de código JavaScript: no es que JSON sea más potente, es que el tooling de JS para consumirlo ya está ahí.
¿Qué llegó primero, XML o JSON, y cómo explica esa historia sus diferencias de diseño?
XML es aproximadamente una década anterior a JSON: XML 1.0 se convirtió en Recomendación del W3C en febrero de 1998, derivado de SGML y diseñado como lenguaje de marcado de documentos (de ahí los atributos, el contenido mixto y los namespaces). JSON se extrajo de la sintaxis de literales de objeto de JavaScript, obra de Douglas Crockford, a principios de los años 2000, se especificó formalmente por primera vez como RFC 4627 en 2006, y luego se volvió a especificar como ECMA-404 (2013) y en su forma actual, RFC 8259 (2017). El minimalismo de JSON — cuatro tipos de datos, sin atributos, sin contenido mixto — refleja su origen como formato de transporte para pasar estructuras de datos hacia y desde un programa en ejecución, no para marcar documentos.
¿Es cierto que JSON es básicamente XML con una sintaxis más ligera?
No — y la convención del prefijo @ que usa esta herramienta para los atributos es en sí misma una prueba de esa diferencia. Esa convención (@clave para atributos, #text para contenido mixto) no forma parte de la especificación de JSON; es una convención ampliamente usada pero informal, y distintas herramientas de conversión de XML a JSON tratan la misma entrada de forma diferente — algunas aplanan los atributos como claves normales, otras envuelven el contenido del elemento en una clave $ o _text, otras usan las convenciones BadgerFish o Parker. JSON no tiene ningún concepto integrado de atributo, así que cualquier herramienta de conversión de XML a JSON está superponiendo su propia convención sobre objetos JSON planos, y la salida JSON de un conversor no tiene por qué coincidir con la de otro para la misma entrada XML.
¿Qué ocurre si dos elementos de distintos namespaces de XML resultan tener el mismo nombre, como <a:id> y <b:id>?
Como este conversor conserva los prefijos de namespace de forma literal como parte del nombre de la clave en lugar de resolverlos a su URI de namespace completa, "a:id" y "b:id" se convierten en dos claves JSON distintas y no colisionan — pero solo mientras los prefijos en sí sean diferentes. Si dos partes distintas de un documento usan el mismo prefijo para URIs de namespace diferentes (algo legal en XML, ya que los enlaces de prefijo tienen alcance limitado al elemento en el que se declaran), o si una herramienta posterior vuelve a parsear el JSON sin contexto de namespace, esa clave basada en el prefijo deja de identificar de forma fiable a qué namespace pertenecía realmente el elemento. Para documentos donde las URIs de namespace importan más que los prefijos, es más seguro normalizar los prefijos antes de la conversión.
Embed This Tool
Add a free, live version of this widget to your own website or blog post — it runs entirely in your visitors' browsers, with a credit link back to The Toolbox.
<iframe src="https://getthetoolbox.com/embed/xml-to-json" title="XML to JSON Converter — The Toolbox" width="100%" height="420" style="max-width:480px;border:1px solid #e2e8f0;border-radius:12px" loading="lazy"></iframe>
<p style="font-size:12px;margin:4px 0 0"><a href="https://getthetoolbox.com/converter-tools/xml-to-json?utm_source=embed&utm_medium=widget" target="_blank" rel="noopener">Free XML to JSON Converter</a> by The Toolbox</p>Herramientas Relacionadas
Conversor de Longitud Gratis en Línea
Convierte entre metros, pies, pulgadas, millas y más unidades de longitud. Gratis, rápido y funciona totalmente en tu navegador sin necesidad de registro.
Conversor de Peso Gratis en Línea
Convierte entre kg, libras, onzas, gramos y más unidades de peso. Gratis, rápido y funciona totalmente en tu navegador sin necesidad de registro.
Conversor de Temperatura Gratis
Convierte temperaturas entre las escalas Celsius, Fahrenheit y Kelvin al instante. Gratis, rápido y funciona totalmente en tu navegador sin necesidad de registro.
Conversor de Área Gratis en Línea
Convierte entre metros cuadrados, acres, hectáreas y más. Gratis, rápido y funciona totalmente en tu navegador sin necesidad de registro.
Acerca del conversor de XML a JSON
XML (el lenguaje de marcado extensible del W3C, publicado por primera vez en 1998 y actualmente en la 5ª edición de la especificación 1.0) y JSON (formalizado como ECMA-404 y RFC 8259) resuelven el mismo problema — el intercambio de datos estructurados y jerárquicos — pero con modelos de datos genuinamente distintos. XML es, en esencia, un formato de documento: cada nodo es un elemento que puede llevar atributos, elementos hijos ordenados y texto libre, todo entremezclado. JSON es un formato de datos construido a partir de cuatro estructuras — objeto, array, cadena/número/booleano y null — sin ningún concepto de atributo ni de texto conviviendo junto a nodos hijos. Convertir entre ambos implica proyectar un modelo sobre el otro, y algunas características de XML simplemente no tienen equivalente en JSON.
Atributos. Los atributos de XML viven dentro de la etiqueta de apertura del elemento: <person id="1" active="true">. Como los objetos JSON no tienen concepto de atributo, esta herramienta convierte cada atributo en una clave del mismo nivel con el prefijo @:
<person id="1"><name>Ada Lovelace</name></person>
{ "person": { "@id": "1", "name": "Ada Lovelace" } }
Elementos repetidos frente a elementos únicos. Esta es la ambigüedad clásica al convertir de XML a JSON. Si un elemento <skills> contiene tres hijos <skill>, se convierten en un array JSON ("skill": ["Math", "Programming", "History"]). Pero si contiene un solo <skill>, el conversor no dispone de ningún esquema al que consultar y no puede saber si ese elemento es inherentemente singular o si simplemente aparece una sola vez en este documento concreto — así que genera una cadena o un objeto plano en lugar de un array de un elemento. Esto significa que la forma de la salida JSON puede cambiar según cuántas veces aparezca una etiqueta hermana en un documento dado, algo relevante si estás escribiendo código contra la salida convertida y esperas un tipo de array consistente.
Contenido mixto. XML permite que texto y elementos se entremezclen dentro del mismo padre — <p>Hello <b>world</b>!</p> — algo que los objetos JSON no pueden representar directamente, ya que los valores de un objeto son o bien una única cadena o bien una estructura anidada, no una mezcla ordenada de ambas cosas. Esta herramienta asigna las porciones de texto a una clave #text junto a las claves de los elementos hijos. Es una aproximación razonable, pero con pérdida: como el modelo de objetos de JSON no preserva el orden de las claves, la posición de entrelazado del texto respecto a los elementos hijos (texto antes de <b> frente a después) no queda totalmente preservada — obtienes las piezas, no su trenzado original.
Lo que no se traduce de forma limpia. Los espacios de nombres de XML (xmlns:soap="...") y las instrucciones de procesamiento (<?xml-stylesheet ...?>) no tienen una representación JSON nativa que este conversor modele. Las etiquetas con prefijo de namespace se convierten en claves literales (por ejemplo, "soap:Envelope"), pero el enlace entre el prefijo y la URI en sí no se conserva por separado, y las instrucciones de procesamiento se descartan por completo, ya que JSON no tiene un tipo de nodo equivalente. Las declaraciones DOCTYPE/DTD de XML y las referencias a entidades (&,  ) también se resuelven y desaparecen — obtienes los datos de carácter ya resueltos, no el marcado original.
Los desarrolladores recurren a esta conversión sobre todo cuando consumen APIs SOAP/XML heredadas desde front ends de JavaScript, cuando migran formatos de configuración XML hacia herramientas basadas en JSON, o cuando normalizan feeds XML (RSS, sitemaps, respuestas SAML) para una canalización nativa en JSON. Como las ambigüedades de atributos frente a arrays mencionadas arriba implican que el round-trip no siempre es sin pérdidas, trata esto como una transformación de un solo sentido pensada para el consumo — no como una garantía de que volver a convertir a XML reproducirá el original byte a byte.