XML a JSON y vuelta

Pega o carga un archivo XML y obtén el JSON correspondiente, o haz el camino contrario. Si el XML está roto te decimos la línea, la columna y la regla que se ha incumplido.

O suelta aquí un archivo .xml o .json, o toca para elegir uno

🔒 El archivo se lee y se convierte dentro de tu navegador: no se sube a ningún sitio y nunca sale de tu dispositivo.

Cómo leer la conversión

Un elemento XML se convierte en un objeto JSON. Los atributos llevan el prefijo @, así que <price currency="EUR">12.90</price> se convierte en {"@currency":"EUR","#text":"12.90"}. Un elemento que solo tiene texto y ningún atributo se convierte en la propia cadena, y un elemento vacío se convierte en null. Los elementos hermanos que comparten nombre se convierten en una lista, y el elemento raíz se queda como única clave en lo más alto. La convención no puede chocar con nada, porque la arroba y la almohadilla no están permitidas dentro de un nombre XML, así que ningún elemento se llamará nunca #text.

La trampa de la lista con un solo elemento

Es el fallo que más duele en producción. Si el feed trae tres elementos <row> obtienes una lista, pero si ese mismo feed trae uno solo obtienes un objeto, y el código que recorre la lista se rompe con un archivo que parecía idéntico. Ningún conversor puede adivinarlo solo con el XML, porque la cardinalidad vive en el esquema (XSD), no en los datos. Por eso existe la casilla que pone siempre los hijos en una lista: actívala cuando el JSON lo lee un programa, déjala apagada cuando quieras un JSON cómodo de leer.

Lo que no llega al JSON

Los comentarios y las instrucciones de procesamiento se quedan fuera, porque JSON no tiene dónde guardarlos, y la página lo dice con un aviso en vez de tirarlos en silencio. Las secciones CDATA se convierten en texto normal. El DOCTYPE se salta, así que las entidades declaradas en un DTD no se resuelven: si aparece alguna, la herramienta se detiene y te la nombra. Los prefijos de espacio de nombres se mantienen tal cual (soap:Envelope sigue siendo soap:Envelope) sin resolver las URI. Los espacios al principio y al final del texto de un elemento se recortan.

Por qué el error te da la línea y la columna

El análisis lo hace un analizador escrito para esta página, no el lector XML del navegador, que da mensajes distintos en Chrome, Firefox y Safari. Así obtienes el punto exacto y la regla que se ha incumplido: en XML las comillas de los atributos son obligatorias, las etiquetas se cierran en el orden inverso al que se abrieron, solo puede haber un elemento raíz y un ampersand suelto hay que escribirlo &amp;. Esos cuatro están detrás de casi todas las exportaciones rechazadas.

De JSON a XML, y las codificaciones de los archivos

Al revés, las claves se convierten en elementos, las claves con arroba se convierten en atributos, #text pasa a ser el texto y las listas se convierten en elementos repetidos. Si una clave no puede ser un nombre XML válido (empieza por una cifra, o contiene un espacio) la herramienta se detiene y te la nombra en vez de estropearla. Los caracteres especiales se escapan igual en el texto que en los valores de los atributos. Cuando cargas un archivo que declara una codificación distinta de UTF-8, ISO-8859-1 por ejemplo, el archivo se vuelve a leer con esa codificación y el resultado siempre es UTF-8. Todo funciona en el navegador, sin enviar nada a ningún servidor.