Convierte documentos XML en JSON desde tu navegador. Conserva atributos con claves prefijadas por @, agrupa elementos repetidos en arrays y convierte tipos de forma opcional.
Lee XML como el arbol de objetos que siempre quiso ser. Pega un documento XML y obten JSON. Los atributos se conservan con claves prefijadas por @, los elementos repetidos se agrupan en arrays y la conversion de tipos es opcional, asi los identificadores conservan sus ceros iniciales.
Salida JSON
Los tres problemas que todo conversor de XML a JSON debe resolver
Los atributos no tienen sitio natural
XML traza una linea firme entre atributos y elementos hijos. <user id="7"><name>Ada</name></user> dice algo distinto de <user><id>7</id><name>Ada</name></user>, aunque la mayoria de aplicaciones los traten igual. JSON no tiene esa distincion, asi que un conversor debe descartar los atributos o inventarles un lugar.
La convencion mas extendida, y la que se aplica aqui, prefija las claves de atributo con @ y guarda el texto del elemento bajo #text cuando este tiene atributos y contenido a la vez. El primer ejemplo pasa entonces a {"user": {"@id": "7", "name": "Ada"}}. El prefijo no forma parte de ningun estandar, pero es lo bastante habitual como para que la mayoria del codigo receptor lo reconozca, y mantiene la conversion reversible. Desactivar los atributos produce una salida mas limpia cuando sabes que son metadatos que no necesitas.
Un item o una lista de uno?
Este es el problema sin respuesta correcta. En XML, un padre con un solo hijo <item> y otro con cinco se parecen estructuralmente, pero deben convertirse en un objeto y en un array respectivamente, y nada en el documento indica cual era la intencion del esquema. Una herramienta sin esquema solo puede deducirlo de lo que ve.
La regla aqui es agrupar en un array los elementos hermanos con el mismo nombre y dejar como valor unico el elemento solitario. Al leer resulta intuitivo, pero implica que el codigo que consuma la salida debe manejar ambas formas, porque una lista que hoy tiene una sola entrada producira un objeto y no un array de un elemento. Si controlas el consumidor, normaliza con algo como [].concat(value) antes de iterar.
En XML todo es texto
Sin un esquema no hay tipos en un documento XML. <count>42</count> y <sku>0042</sku> son solo texto, y unicamente una persona o un XSD sabe que el primero es un numero y el segundo un identificador que debe conservar sus ceros.
Por eso la conversion de tipos es una casilla y no el comportamiento por defecto. Cuando esta activa, los valores solo se convierten si la ida y vuelta es exacta: una cadena numerica pasa a numero unicamente si al formatearla de nuevo se obtiene el mismo texto, lo que protege 0042, +7 y 1e999. true, false y los elementos vacios pasan a booleanos y null. Cuando esta desactivada todo sigue siendo cadena, la opcion mas segura para identificadores, telefonos, codigos postales y cualquier entero por encima de 2^53, donde la precision numerica de JavaScript corromperia el valor en silencio.
Preguntas frecuentes
Se sube mi XML a algun sitio?
No. El analisis usa el DOMParser nativo del navegador y el JSON se genera localmente, por lo que el documento nunca sale de la pagina.
Como se representan los atributos?
Como claves prefijadas por @, junto a los hijos del elemento. Si un elemento tiene atributos y texto, el texto se guarda bajo la clave #text.
Por que un elemento unico no se convirtio en array?
Sin esquema nada indica si un hijo es un valor unico o una lista de uno. Los nombres repetidos pasan a array; un elemento solitario sigue siendo valor unico.
Que hace la conversion de tipos?
Convierte valores numericos, booleanos y vacios desde texto. Los numeros solo se convierten si la ida y vuelta es exacta, asi 0042 y +7 siguen siendo cadenas.
Cuando conviene dejarla desactivada?
Con identificadores, telefonos, codigos postales y enteros mayores de 2^53, donde la precision numerica de JavaScript redondearia el valor sin avisar.
Por que aparece un error de XML invalido?
El documento no esta bien formado: etiquetas sin cerrar o mal emparejadas, un & o < sin escapar, o mas de un elemento raiz son las causas habituales.