XML a JSON
Atributos, CDATA y entidades resueltos, y las etiquetas mal cerradas señaladas con precisión.
Nada de lo que pegues sale de tu navegador. La lista de permitidos de connect-src convierte eso en una garantía del navegador, no en una promesa. Compruébalo tú mismo
Convierte XML a JSON, con los atributos, las secciones CDATA y las referencias a entidades resueltos, y el XML mal formado reportado con precisión en vez de genéricamente.
El XML lleva más estructura de la que el JSON puede sostener, así que esta dirección pierde información de formas concretas. Todas ellas se reportan en las notas cuando afectan a tu documento.
Errores que nombran el problema real
El navegador trae un parser de XML incorporado, pero su reporte de errores es un fragmento de HTML localizado que no se puede leer de forma fiable. Esta página usa su propio parser para que los diagnósticos estén a la altura de los del lado JSON.
- Etiquetas que no coinciden
- Nombra tanto la etiqueta de cierre como el elemento que debería haber cerrado. El XML anida de forma estricta, a diferencia del HTML.
- Elementos sin cerrar
- Lista todo lo que seguía abierto cuando terminó el documento.
- Un segundo elemento raíz
- Un documento XML tiene exactamente uno. Suele ser el resultado de concatenar dos archivos.
- Costumbres de HTML
- Un atributo sin valor como checked, o un valor de atributo sin comillas. Ambos son HTML legal y ninguno es XML legal.
- Comentarios y CDATA sin terminar
- Se reportan en la posición donde se abrió la sección.
Lo que JSON no puede representar
- Contenido mixto
- Un elemento con texto y elementos hijo a la vez. JSON no tiene forma de mantener el texto ordenado respecto a los hijos, así que el texto se recoge en una única clave #text y la conversión lo dice.
- El orden de elementos con nombres distintos
- Los hermanos repetidos pasan a ser un array y conservan su orden, pero el orden relativo entre hermanos con nombres distintos se pierde, porque las claves de un objeto JSON no llevan orden.
- Espacios de nombres
- Los prefijos se conservan como parte del nombre; las declaraciones de espacio de nombres pasan a ser atributos corrientes.
- Un elemento frente a muchos
- Una lista con un único elemento pasa a ser un valor suelto en vez de un array de uno, que es la fuente clásica de fallos aguas abajo. Activa «usar siempre arrays» para evitarlo.
Tipos
El XML es texto. Todo es una cadena salvo que actives la inferencia, e incluso entonces cualquier valor que no sobreviviría a un ida y vuelta por float64 se queda como cadena. Es la misma política que en el conversor de CSV y por el mismo motivo.
How to do this in code
Convertir en código.
py Python
import xmltodict, json
data = xmltodict.parse(xml_text)
print(json.dumps(data, indent=2))
# force_list keeps single elements as arrays, which stops the
# classic "sometimes a list, sometimes an object" bug.
data = xmltodict.parse(xml_text, force_list={'item'}) js JavaScript
import { XMLParser } from 'fast-xml-parser';
const parser = new XMLParser({
ignoreAttributes: false,
attributeNamePrefix: '@',
isArray: (name) => name === 'item',
});
const data = parser.parse(xmlText); sh Shell
# xq, the XML front end to jq
xq . input.xml
# Or with Python, no extra install beyond xmltodict
python -c 'import sys,xmltodict,json; print(json.dumps(xmltodict.parse(sys.stdin.read()), indent=2))' < in.xml Preguntas frecuentes
- ¿Por qué una de mis listas no es un array?
- Porque tenía exactamente un elemento, y un hijo único no se puede distinguir de una lista de uno. Activa «usar siempre arrays». Merece la pena siempre que la salida alimente a código y no a una persona, porque elimina toda una clase de fallos.
- ¿Qué ha pasado con mis espacios de nombres?
- Los prefijos sobreviven como parte del nombre de la clave y las declaraciones xmlns pasan a ser atributos corrientes. JSON no tiene el concepto de espacio de nombres, así que la relación semántica entre ambos se pierde.
- ¿Por qué mi HTML no se parsea?
- El HTML no es XML. Un <br> sin cerrar, los atributos sin valor y los valores sin comillas son todos HTML legal y ninguno es XML legal. Para HTML necesitas un parser de HTML, no esto.