Python XML a JSON, XML a Dict

Hoy aprenderemos cómo convertir XML a JSON y XML a Dict en Python. Podemos usar el módulo xmltodict de Python para leer archivos XML y convertirlos a Dict o datos JSON. También podemos recorrer archivos XML grandes y convertirlos a Diccionarios. Antes de adentrarnos en la parte de codificación, primero entendamos por qué es necesaria la conversión XML.

Convertir XML a Dict/JSON

Los archivos XML han ido quedando obsoletos, pero todavía hay sistemas bastante grandes en la web que utilizan este formato. XML es más pesado que JSON y, por lo tanto, la mayoría de los desarrolladores prefieren este último en sus aplicaciones. Cuando las aplicaciones necesitan entender el XML proporcionado por cualquier fuente, puede ser una tarea tediosa convertirlo a JSON. El módulo xmltodict en Python hace que esta tarea sea extremadamente fácil y directa de realizar.

Empezando con xmltodict

Podemos comenzar con el módulo xmltodict, pero primero necesitamos instalarlo. Principalmente usaremos pip para realizar la instalación.

Instalar el módulo xmltodict

Aquí está cómo podemos instalar el módulo xmltodict usando Python Package Index (pip):

pip install xmltodict

Esto se hará rápidamente ya que xmltodict es un módulo muy ligero. Aquí está la salida para esta instalación: Lo mejor de esta instalación fue que este módulo no depende de ningún otro módulo externo y, por lo tanto, es ligero y evita cualquier conflicto de versiones. Solo para demostrar, en sistemas basados en Debian, este módulo se puede instalar fácilmente usando la herramienta apt:

sudo apt install python-xmltodict

Otro punto a favor es que este módulo tiene un paquete oficial de Debian.

Python XML a JSON

El mejor lugar para comenzar a probar este módulo será realizar una operación para la que fue diseñado principalmente, realizar conversiones de XML a JSON. Veamos un fragmento de código sobre cómo se puede hacer esto:

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)))

Veamos la salida para este programa: Aquí, simplemente usamos la función parse(...) para convertir datos XML a JSON y luego utilizamos el módulo json para imprimir JSON en un formato mejorado.

Convertir Archivo XML a JSON

Mantener los datos XML en el propio código no siempre es posible ni realista. Por lo general, mantenemos nuestros datos en una base de datos o en algunos archivos. También podemos seleccionar archivos directamente y convertirlos a JSON. Veamos un fragmento de código de cómo podemos realizar la conversión con un archivo 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))

Veamos la salida para este programa: Aquí, usamos otro módulo pprint para imprimir la salida de manera formateada. Además de eso, usar la función open(...) fue sencillo, la usamos para obtener un descriptor de archivo y luego analizamos el archivo en un objeto JSON.

Python XML a Dict

Como sugiere el nombre del módulo, xmltodict convierte realmente los datos XML que proporcionamos en simplemente un diccionario de Python. Por lo tanto, también podemos acceder a los datos con las claves del diccionario. Aquí hay un programa de muestra:

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 a ver la salida de este programa: Así que las etiquetas se pueden usar como claves junto con las claves de atributo también. Las claves de atributo solo necesitan tener el símbolo @ como prefijo.

Soporte de Espacios de Nombres en XML

En los datos XML, usualmente tenemos un conjunto de espacios de nombres que define el alcance de los datos proporcionados por el archivo XML. Al convertir al formato JSON, es necesario que estos espacios de nombres persistan también en el formato JSON. Consideremos este archivo XML de muestra:

<root xmlns="https://defaultns.com/"
        xmlns:a="https://a.com/">
    <audience>
        <id what="attribute">123</id>
        <name>Shubham</name>
    </audience>
</root>

Aquí hay un programa de muestra sobre cómo podemos incluir espacios de nombres XML en el formato JSON también:

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 a ver la salida de este programa:

Conversión de JSON a XML

Aunque la conversión de XML a JSON es el objetivo principal de este módulo, xmltodict también admite realizar la operación inversa, convirtiendo JSON a formato XML. Proporcionaremos los datos JSON en el propio programa. Aquí hay un programa de muestra:

import xmltodict

student = {
  "data" : {
    "name" : "Shubham",
    "marks" : {
      "math" : 92,
      "english" : 99
    },
    "id" : "s387hs3"
  }
}

print(xmltodict.unparse(student, pretty=True))

Veamos la salida de este programa: Ten en cuenta que es necesario proporcionar una sola clave JSON para que esto funcione correctamente. Si consideramos que modificamos nuestro programa para contener varias claves JSON en el primer nivel de datos, como:

import xmltodict

student = {
    "name" : "Shubham",
    "marks" : {
        "math" : 92,
        "english" : 99
    },
    "id" : "s387hs3"
}

print(xmltodict.unparse(student, pretty=True))

En este caso, tenemos tres claves en el nivel raíz. Si intentamos deshacer esta forma de JSON, nos enfrentaremos a este error: Esto sucede porque xmltodict necesita construir el JSON con la primera clave como la etiqueta XML raíz. Esto significa que solo debe haber una clave JSON en el nivel raíz de los datos.

Conclusión

En esta lección, estudiamos un excelente módulo de Python que se puede utilizar para analizar y convertir XML a JSON y viceversa. También aprendimos cómo convertir XML a un diccionario utilizando el módulo xmltodict. Referencia: Documentación de la API

Source:
https://www.digitalocean.com/community/tutorials/python-xml-to-json-dict