Converter XML em dicionário em Python

Hemank Mehtani 30 janeiro 2023
  1. Use o módulo xmltodict para converter string XML em um dicionário em Python
  2. Use a biblioteca cElemenTree para converter string XML em dicionário em Python
Converter XML em dicionário em Python

XML é conhecido como Extensible Markup Language. É usado para armazenar e transportar pequenas a médias quantidades de dados e também é amplamente usado para compartilhar informações estruturadas. Python nos permite analisar e modificar os documentos XML.

Neste tutorial, demonstraremos como converter string XML em um dicionário em Python.

Use o módulo xmltodict para converter string XML em um dicionário em Python

xmltodict é um módulo em Python que faz o trabalho com XML parecer JSON. Devido à estrutura do XML, ele pode ser facilmente convertido em um dicionário usando este módulo.

Veja o trecho de código abaixo.

import xmltodict

xml_data = """
    <student>
      <id>DEL</id>
      <name> Jack </name>
      <email>jack@example.com</email>
      <smeseter>8</smeseter>
      <class>CSE</class>
      <cgpa> 7.5</cgpa>
    </student>
"""

d = xmltodict.parse(xml_data)
print(d)

Resultado:

OrderedDict([('student', OrderedDict([('id', 'DEL'), ('name', 'Jack'), ('email', 'jack@example.com'), ('smeseter', '8'), ('class', 'CSE'), ('cgpa', '7.5')]))])

Aqui, podemos ver que o resultado está na forma de um dicionário ordenado. Um dicionário ordenado preserva a ordem dos pares de valores-chave em um dicionário. A função parse() aqui analisa os dados XML em um dicionário ordenado.

Use a biblioteca cElemenTree para converter string XML em dicionário em Python

cElementTree é uma biblioteca Python essencial que nos permite analisar e navegar em um documento XML. Com cElementTree, podemos dividir o documento XML em uma estrutura de árvore fácil de trabalhar.

Criaremos nossa própria função para analisar os dados XML e convertê-los em um dicionário. Usaremos um objeto de classe deafultdict do módulo collections para obter o resultado final em nossa forma desejada.

Veja o seguinte código.

from collections import defaultdict
from xml.etree import cElementTree as ET


def xml2dict(t):
    d = {t.tag: {} if t.attrib else None}
    children = list(t)
    if children:
        dd = defaultdict(list)
        for dc in map(etree_to_dict, children):
            for k, v in dc.items():
                dd[k].append(v)
        d = {t.tag: {k: v[0] if len(v) == 1 else v for k, v in dd.items()}}
    if t.attrib:
        d[t.tag].update(("@" + k, v) for k, v in t.attrib.items())
    if t.text:
        text = t.text.strip()
        if children or t.attrib:
            if text:
                d[t.tag]["#text"] = text
        else:
            d[t.tag] = text
    return d


xml_data = ET.XML(
    """
    <student>
      <id>DEL</id>
      <name> Jack </name>
      <email>jack@example.com</email>
      <smeseter>8</smeseter>
      <class>CSE</class>
      <cgpa> 7.5</cgpa>
    </student>
"""
)

d = xml2dict(xml_data)

print(d)

Resultado:

{'student': {'id': 'DEL', 'name': 'Jack', 'email': 'jack@example.com', 'smeseter': '8', 'class': 'CSE', 'cgpa': '7.5'}}

Observe que esta é uma estrutura em árvore de um dicionário. Observe que o dicionário final geralmente é um dicionário aninhado em ambos os métodos. Isso se deve à estrutura do XML.

Artigo relacionado - Python Dictionary

Artigo relacionado - Python XML