Converti XML in dizionario in Python

Hemank Mehtani 9 luglio 2021
  1. Usa il modulo xmltodict per convertire stringhe XML in un dizionario in Python
  2. Usa la libreria cElemenTree per convertire la stringa XML in un dizionario in Python
Converti XML in dizionario in Python

XML è noto come Extensible Markup Language. Viene utilizzato per archiviare e trasportare quantità di dati da piccole a medie ed è anche ampiamente utilizzato per la condivisione di informazioni strutturate. Python ci consente di analizzare e modificare i documenti XML.

In questo tutorial, dimostreremo come convertire una stringa XML in un dizionario in Python.

Usa il modulo xmltodict per convertire stringhe XML in un dizionario in Python

xmltodict è un modulo in Python che rende il lavoro con XML simile a JSON. A causa della struttura di XML, può essere facilmente convertito in un dizionario utilizzando questo modulo.

Vedi lo snippet di codice di seguito.

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)

Produzione:

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

Qui possiamo vedere che il risultato è sotto forma di un dizionario ordinato. Un dizionario ordinato conserva l’ordine delle coppie chiave-valore in un dizionario. La funzione parse() qui analizza i dati XML in un dizionario ordinato.

Usa la libreria cElemenTree per convertire la stringa XML in un dizionario in Python

cElementTree è una libreria Python essenziale che ci consente di analizzare e navigare in un documento XML. Con cElementTree, possiamo suddividere il documento XML in una struttura ad albero con cui è facile lavorare.

Creeremo la nostra funzione per analizzare i dati XML e convertirli in un dizionario. Useremo un oggetto di classe deafultdict dal modulo collections per ottenere il risultato finale nella nostra forma desiderata.

Vedere il seguente codice.

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)

Produzione:

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

Nota che questa è una struttura ad albero di un dizionario. Si noti che il dizionario finale è solitamente un dizionario annidato in entrambi i metodi. Ciò è dovuto alla struttura dell’XML.

Articolo correlato - Python Dictionary

Articolo correlato - Python XML