Convertir XML a diccionario en Python

Hemank Mehtani 30 enero 2023
  1. Utilice el módulo xmltodict para convertir cadenas XML en un diccionario en Python
  2. Utilice la biblioteca cElemenTree para convertir cadenas XML en un diccionario en Python
Convertir XML a diccionario en Python

XML se conoce como lenguaje de marcado extensible. Se utiliza para almacenar y transportar pequeñas o medianas cantidades de datos, y también se utiliza ampliamente para compartir información estructurada. Python nos permite analizar y modificar los documentos XML.

En este tutorial, demostraremos cómo convertir una cadena XML en un diccionario en Python.

Utilice el módulo xmltodict para convertir cadenas XML en un diccionario en Python

xmltodict es un módulo en Python que hace que trabajar con XML se sienta como JSON. Debido a la estructura de XML, se puede convertir fácilmente a un diccionario usando este módulo.

Consulte el fragmento de código a continuación.

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)

Producción :

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

Aquí, podemos ver que el resultado tiene la forma de un diccionario ordenado. Un diccionario ordenado conserva el orden de los pares clave-valor en un diccionario. La función parse() aquí analiza los datos XML en un diccionario ordenado.

Utilice la biblioteca cElemenTree para convertir cadenas XML en un diccionario en Python

cElementTree es una biblioteca Python esencial que nos permite analizar y navegar por un documento XML. Con cElementTree, podemos dividir el documento XML en una estructura de árbol con la que es fácil trabajar.

Crearemos nuestra propia función para analizar los datos XML y convertirlos en un diccionario. Usaremos un objeto de clase deafultdict del módulo collections para obtener el resultado final en la forma deseada.

Consulte el siguiente 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)

Producción :

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

Tenga en cuenta que esta es una estructura de árbol de un diccionario. Tenga en cuenta que el diccionario final suele ser un diccionario anidado en ambos métodos. Esto se debe a la estructura del XML.

Artículo relacionado - Python Dictionary

Artículo relacionado - Python XML