Ir para o conteúdo
jsonbeautifiers
Português

XML para JSON

Atributos, CDATA e entidades tratados, e tags que não fecham apontadas com precisão.

XML
JSON

Nada do que você cola sai do seu navegador. A lista de permissões connect-src transforma isso em uma garantia do navegador, e não em uma promessa. Confira você mesmo

Converta XML para JSON, com atributos, seções CDATA e referências de entidade tratados, e XML malformado reportado com precisão em vez de genericamente.

O XML carrega mais estrutura do que o JSON consegue guardar, então esta direção perde informação de maneiras específicas. Cada uma delas é reportada nas notas quando se aplica ao seu documento.

Erros que apontam o problema de verdade

O navegador tem um parser de XML embutido, mas o relato de erro dele é um fragmento de HTML localizado que não dá para ler de forma confiável. Esta página usa o próprio parser para que os diagnósticos fiquem à altura dos do lado JSON.

Tags que não combinam
Aponta tanto a tag de fechamento quanto o elemento que ela deveria ter fechado. O XML aninha de forma estrita, ao contrário do HTML.
Elementos não fechados
Lista tudo o que ainda estava aberto quando o documento acabou.
Um segundo elemento raiz
Um documento XML tem exatamente um. Costuma ser resultado de concatenar dois arquivos.
Costumes de HTML
Um atributo sem valor como checked, ou um valor de atributo sem aspas. Os dois são HTML válido e nenhum é XML válido.
Comentários e CDATA não terminados
Reportados na posição em que a seção foi aberta.

O que o JSON não consegue representar

Conteúdo misto
Um elemento com texto e elementos filhos ao mesmo tempo. O JSON não tem como manter o texto ordenado em relação aos filhos, então o texto é reunido em uma única chave #text e a conversão avisa disso.
A ordem entre elementos de nomes diferentes
Irmãos repetidos viram um array e mantêm a ordem, mas a ordem relativa entre irmãos com nomes diferentes se perde, porque chaves de objeto JSON não carregam ordem.
Namespaces
Os prefixos são mantidos como parte do nome; as declarações de namespace em si viram atributos comuns.
Um elemento contra vários
Uma lista com um único elemento vira um valor solto em vez de um array de um, que é a fonte clássica de bugs lá na frente. Ligue "sempre usar arrays" para evitar isso.

Tipos

XML é texto. Tudo é string a menos que você ligue a inferência, e mesmo assim um valor que não sobreviveria a uma ida e volta em float64 continua string. É a mesma política do conversor de CSV, e pelo mesmo motivo.

How to do this in code

Convertendo em 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

Perguntas frequentes

Por que uma das minhas listas não é um array?
Porque ela tinha exatamente um elemento, e um filho único não dá para distinguir de uma lista de um. Ligue "sempre usar arrays". Vale a pena sempre que a saída alimenta código em vez de uma pessoa, porque elimina uma classe inteira de bug.
O que aconteceu com os meus namespaces?
Os prefixos sobrevivem como parte do nome da chave e as declarações xmlns viram atributos comuns. O JSON não tem conceito de namespace, então a relação semântica entre eles se perde.
Por que o meu HTML não faz parsing?
HTML não é XML. Um <br> não fechado, atributos sem valor e valores sem aspas são todos HTML válido e nenhum é XML válido. Para HTML você precisa de um parser de HTML, não deste aqui.