Python XML para JSON, XML para Dicionário

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