Convertidor XML a JSON para SOAP, payloads de API y atributos de etiquetas
Lee respuestas SOAP o payloads XML de API como JSON en el navegador, y vuelve a escribir objetos JSON como etiquetas y atributos. El mapeo compact es predecible, pero un hijo único y dos hijos con el mismo nombre producen estructuras JSON distintas, y no se conserva el orden del texto mezclado.
Cómo se comporta este convertidor XML ↔ JSON
Las etiquetas son claves, los atributos van a _attributes
Cada elemento se convierte en una clave con el nombre de su etiqueta. <user id="7">Ann</user> pasa a { user: { _attributes: { id: "7" }, _text: "Ann" } }, sin mezclar atributos y texto con las etiquetas hijas.
Un hijo es un objeto, dos se convierten en array
Un solo <item> sigue siendo objeto; dos <item> hermanos se convierten en un array JSON. Cuando una respuesta pasa de dos filas a una, la estructura cambia, así que el cliente debe admitir ambas formas.
Declaración, comentarios y CDATA tienen claves propias
_declaration, _doctype, _comment y _cdata aparecen al mismo nivel que el elemento raíz. CDATA se lee como texto sin procesar y los cuatro se vuelven a escribir al convertir JSON → XML.
El texto se conserva, su posición no
En modo compact, el texto a ambos lados de un hijo se fusiona en un array _text: <r>before<a>1</a>after</r> pasa a _text: ["before", "after"] y, al escribirlo de nuevo, beforeafter<a>1</a>. Para un ida y vuelta limpio, usa contenido solo con elementos.
Se admiten espacios de nombres y caracteres especiales
xmlns / xmlns:p siguen siendo atributos normales, y <, & y > del texto se escapan al escribir y se restauran al leer. Todo se ejecuta localmente; no se sube nada.
Preguntas frecuentes sobre XML ↔ JSON
¿Por qué cambia la estructura JSON cuando solo llega una fila?
Por el modo compact de xml-js: los hijos homónimos repetidos se convierten en array y un hijo único sigue siendo objeto. Dos <item> dan item: [...], uno da item: {...}. Normaliza a array antes de leer los campos.
¿Cómo se representan los atributos y el texto?
Los atributos van a _attributes y el texto a _text, por ejemplo <user id="7">Ann</user> → { user: { _attributes: { id: "7" }, _text: "Ann" } }. El texto siempre es cadena, incluso en <n>42</n>, y un elemento vacío pasa a {}.
¿Puedo convertir un array JSON raíz a XML?
No. La raíz JSON debe ser un único objeto; un array raíz genera nombres de etiqueta inválidos como <0><r>a</r></0><1><r>b</r></1>. Envuelve el array en un objeto raíz, por ejemplo { "items": { "item": [...] } }.
¿Se conservan la declaración, comentarios, CDATA y DOCTYPE?
Sí, con las claves _declaration, _comment, _cdata y _doctype. Al leer, _comment incluye los espacios de alrededor (p. ej. " hi "); al convertir de vuelta se escriben <?xml ...?>, <!--hi-->, <![CDATA[...]]> y <!DOCTYPE r>.
¿Qué ocurre con el texto mezclado entre elementos hijos?
El modo compact agrupa los fragmentos de texto en un array _text y pierde sus posiciones. <r>before<a>1</a>after</r> pasa a { r: { _text: ["before", "after"], a: { _text: "1" } } }, y al escribirlo se obtiene <r>beforeafter<a>1</a></r>. El modo no compact conserva el orden, pero esta página está fijada en compact.
¿Cómo se tratan los espacios de nombres y los caracteres especiales?
Las declaraciones de espacio de nombres se conservan como atributos normales (xmlns, xmlns:p) y las etiquetas con prefijo mantienen el prefijo en la clave (p:a). El texto escapa <, & y > al escribir y resuelve entidades al leer; los valores de atributo solo escapan comillas, así que un < o & sin escapar dentro de un atributo aún puede producir XML inválido.
¿Qué errores aparecen y se suben mis datos?
Varias raíces fallan con «Text data outside of root node», una etiqueta de cierre incorrecta con «Unmatched closing tag», una raíz escalar con «The JSON structure is invalid». El cuadro se pone rojo y no se escribe salida parcial. Todo se ejecuta en el navegador y los archivos nunca se suben.

