XML para JSON
Atributos, CDATA e entidades tratados, e tags que não fecham apontadas com precisão.
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.