Hoje vamos aprender como converter XML para JSON e XML para Dict em Python. Podemos usar o módulo xmltodict
do Python para ler um arquivo XML e convertê-lo para Dict ou dados JSON. Também podemos processar arquivos XML grandes e convertê-los para Dicionário. Antes de entrarmos na parte de código, vamos primeiro entender por que a conversão de 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 utilizam esse formato. XML é mais pesado do que o JSON e, portanto, a maioria dos desenvolvedores prefere este último em suas aplicações. Quando as aplicações precisam entender o XML fornecido por qualquer origem, pode ser uma tarefa tediosa convertê-lo para JSON. O módulo xmltodict
em Python torna essa tarefa extremamente fácil e direta de ser realizada.
Começando com xmltodict
Podemos começar com o módulo xmltodict
, mas primeiro precisamos instalá-lo. Vamos usar principalmente o pip para realizar a instalação.
Instale o módulo xmltodict
Aqui está como podemos instalar o módulo xmltodict usando o Índice de Pacotes Python (pip):
pip install xmltodict
Isso será feito rapidamente, pois o xmltodict
é um módulo muito leve. Aqui está a saída para esta instalação: A melhor coisa sobre esta instalação foi que este módulo não é dependente de nenhum outro módulo externo e, portanto, é leve e evita quaisquer conflitos de versão. Apenas para demonstrar, em sistemas baseados em Debian, este módulo pode ser facilmente instalado usando a ferramenta
apt
:
sudo apt install python-xmltodict
Outro ponto positivo é que este módulo tem um pacote oficial do Debian.
XML para JSON em Python
O melhor lugar para começar a experimentar este módulo será realizar uma operação para a qual foi principalmente feito, realizar conversões de 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 depois utilizamos 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 escolher 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, usar a função
open(...)
foi direto, nós a usamos 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 os dados XML fornecidos em um simples dicionário Python. Assim, podemos acessar os dados facilmente 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, que precisam ser prefixadas com o símbolo
@
.
Suportando namespaces em XML
Em 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. 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:
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 a forma 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 reverter 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 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: Doc API
Source:
https://www.digitalocean.com/community/tutorials/python-xml-to-json-dict