XML para JSON e vice-versa

Cole ou carregue um arquivo XML e receba o JSON correspondente, ou faça o caminho inverso. Se o XML estiver quebrado, dizemos a linha, a coluna e a regra que foi violada.

Ou solte aqui um arquivo .xml ou .json, ou toque para escolher um

O arquivo é lido e convertido dentro do seu navegador: nunca é enviado para lugar nenhum e nunca sai do seu dispositivo.

Como ler a conversão

Um elemento XML vira um objeto JSON. Os atributos ganham o prefixo @, então <price currency="EUR">12.90</price> vira {"@currency":"EUR","#text":"12.90"}. Um elemento com apenas texto e sem atributos vira a própria string, e um elemento vazio vira null. Elementos irmãos com o mesmo nome viram uma lista, e o elemento raiz continua como a única chave no topo. A convenção não pode gerar conflito, porque a arroba e a cerquilha (#) não são permitidas dentro de um nome XML, então nenhum elemento jamais se chamará #text.

A armadilha da lista de um item só

É essa que pega você de surpresa em produção. Se o feed traz três elementos <row> , você recebe uma lista, mas se esse mesmo feed traz um só, você recebe um objeto, e o código que percorre a lista quebra num arquivo que parecia idêntico. Nenhum conversor consegue adivinhar isso só pelo XML, porque a cardinalidade mora no esquema (XSD), não nos dados. Por isso existe a caixa que sempre coloca os filhos em uma lista: ative-a quando um programa for ler o JSON e deixe-a desativada quando quiser um JSON agradável de ler.

O que não vai para o JSON

Comentários e instruções de processamento ficam de fora, porque o JSON não tem onde guardá-los, e a página avisa com um alerta em vez de descartá-los em silêncio. Seções CDATA viram texto puro. O DOCTYPE é ignorado, então as entidades declaradas em uma DTD não são resolvidas: se aparecer uma, a ferramenta para e diz qual. Os prefixos de namespace são mantidos literalmente (soap:Envelope continua soap:Envelope) sem resolver URIs. Os espaços no início e no fim do texto de um elemento são removidos.

Por que o erro informa linha e coluna

A leitura é feita por um parser escrito para esta página, e não pelo leitor de XML do navegador, que dá mensagens diferentes no Chrome, no Firefox e no Safari. Assim você recebe o ponto exato e a regra que foi violada: as aspas dos atributos XML são obrigatórias, as tags se fecham na ordem inversa em que foram abertas, só pode haver um elemento raiz, e um & sozinho precisa ser escrito &amp;. Esses quatro estão por trás de quase toda exportação rejeitada. Se o arquivo a converter for YAML, o formato baseado em indentação, existe o YAML para JSON.

A volta de JSON para XML, e a codificação dos arquivos

No caminho inverso, as chaves viram elementos, as chaves com arroba viram atributos, #text vira o texto e as listas viram elementos repetidos. Se uma chave não puder ser um nome XML válido (começa com um dígito ou contém um espaço), a ferramenta para e diz qual é, em vez de deformá-la. Os caracteres especiais são escapados tanto no texto quanto nos valores de atributo. Quando você carrega um arquivo que declara uma codificação diferente de UTF-8, ISO-8859-1 por exemplo, o arquivo é lido de novo com essa codificação e o resultado é sempre UTF-8. Tudo roda no navegador, sem nada enviado a um servidor.

Ferramentas relacionadas