Hoje vamos aprender como converter XML para JSON e XML para Dicionário em Python. Podemos usar o módulo xmltodict
do Python para ler arquivos XML e convertê-los em Dicionário ou dados JSON. Também podemos percorrer grandes arquivos XML e convertê-los em Dicionário. Antes de começarmos a parte de codificação, vamos primeiro entender por que a conversão XML é necessária.
Convertendo XML para Dict/JSON
Os arquivos XML têm se tornado obsoletos lentamente, mas ainda existem sistemas grandes na web que ainda usam esse formato. XML é mais pesado que JSON e, por isso, a maioria dos desenvolvedores prefere este último em suas aplicações. Quando as aplicações precisam entender o XML fornecido por qualquer fonte, pode ser uma tarefa tediosa convertê-lo para JSON. O módulo xmltodict
em Python torna essa tarefa extremamente fácil e direta de realizar.
Começando com xmltodict
Podemos começar com o módulo xmltodict
, mas primeiro precisamos instalá-lo. Vamos usar principalmente pip para fazer a instalação.
Instalar o módulo xmltodict
Aqui está como podemos instalar o módulo xmltodict usando Python Package Index (pip):
pip install xmltodict
Isso será feito rapidamente, pois o módulo xmltodict
é muito leve. Aqui está a saída para esta instalação: O melhor desta instalação é que este módulo não depende de nenhum outro módulo externo, sendo assim leve e evitando conflitos de versão. Apenas para demonstração, em sistemas baseados no Debian, este módulo pode ser facilmente instalado usando a ferramenta
apt
:
sudo apt install python-xmltodict
Outro ponto positivo é que este módulo possui um pacote oficial Debian.
Python XML para JSON
O melhor lugar para começar a usar este módulo é realizar uma operação para a qual foi principalmente projetado, converter XML para JSON. Vamos dar uma olhada em um trecho de código sobre como isso pode ser feito:
import xmltodict
import pprint
import json
my_xml = """
<audience>
<id what="attribute">123</id>
<name>Shubham</name>
</audience>
"""
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(json.dumps(xmltodict.parse(my_xml)))
Vamos ver a saída para este programa: Aqui, simplesmente usamos a função parse(...)
para converter dados XML em JSON e então usamos o módulo json
para imprimir o JSON em um formato melhor.
Convertendo Arquivo XML para JSON
Manter os dados XML no próprio código nem sempre é possível nem realista. Normalmente, mantemos nossos dados em um banco de dados ou em alguns arquivos. Também podemos pegar arquivos diretamente e convertê-los para JSON. Vamos dar uma olhada em um trecho de código de como podemos realizar a conversão com um arquivo XML:
import xmltodict
import pprint
import json
with open('person.xml') as fd:
doc = xmltodict.parse(fd.read())
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(json.dumps(doc))
Vamos ver a saída para este programa: Aqui, usamos outro módulo pprint para imprimir a saída de maneira formatada. Além disso, o uso da função
open(...)
foi direto, usamos ela para obter um descritor de arquivo e depois analisamos o arquivo em um objeto JSON.
Python XML para Dict
Conforme o próprio nome do módulo sugere, o xmltodict converte efetivamente os dados XML que fornecemos para apenas um simples dicionário Python. Assim, podemos acessar os dados simplesmente com as chaves do dicionário. Aqui está um programa de exemplo:
import xmltodict
import pprint
import json
my_xml = """
<audience>
<id what="attribute">123</id>
<name>Shubham</name>
</audience>
"""
my_dict = xmltodict.parse(my_xml)
print(my_dict['audience']['id'])
print(my_dict['audience']['id']['@what'])
Vamos ver a saída para este programa: Portanto, as tags podem ser usadas como chaves juntamente com as chaves dos atributos também. As chaves dos atributos só precisam ser prefixadas com o símbolo
@
.
Suporte a namespaces em XML
Nos dados XML, geralmente temos um conjunto de namespaces que define o escopo dos dados fornecidos pelo arquivo XML. Ao converter para o formato JSON, é necessário que esses namespaces persistam no formato JSON também. Vamos considerar este arquivo XML de exemplo:
<root xmlns="https://defaultns.com/"
xmlns:a="https://a.com/">
<audience>
<id what="attribute">123</id>
<name>Shubham</name>
</audience>
</root>
Aqui está um programa de exemplo sobre como podemos incluir namespaces XML no formato JSON também:
import xmltodict
import pprint
import json
with open('person.xml') as fd:
doc = xmltodict.parse(fd.read(), process_namespaces=True)
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(json.dumps(doc))
Vamos ver a saída para este programa:
Conversão de JSON para XML
Embora a conversão de XML para JSON seja o principal objetivo deste módulo, o xmltodict também suporta a operação inversa, convertendo JSON para formato XML. Vamos fornecer os dados JSON no próprio programa. Aqui está um programa de exemplo:
import xmltodict
student = {
"data" : {
"name" : "Shubham",
"marks" : {
"math" : 92,
"english" : 99
},
"id" : "s387hs3"
}
}
print(xmltodict.unparse(student, pretty=True))
Vamos ver a saída para este programa: Por favor, note que fornecer uma única chave JSON é necessário para que isso funcione corretamente. Se considerarmos que modificamos nosso programa para conter várias chaves JSON no primeiro nível de dados, como:
import xmltodict
student = {
"name" : "Shubham",
"marks" : {
"math" : 92,
"english" : 99
},
"id" : "s387hs3"
}
print(xmltodict.unparse(student, pretty=True))
Neste caso, temos três chaves no nível raiz. Se tentarmos desfazer esta forma de JSON, enfrentaremos este erro: Isso acontece porque o xmltodict precisa construir o JSON com a primeira chave como a tag XML raiz. Isso significa que deve haver apenas uma única chave JSON no nível raiz dos dados.
Conclusão
Nesta lição, estudamos um excelente módulo Python que pode ser usado para analisar e converter XML para JSON e vice-versa. Também aprendemos como converter XML para Dict usando o módulo xmltodict. Referência: Documentação da API
Source:
https://www.digitalocean.com/community/tutorials/python-xml-to-json-dict