HOWTO · Python
Converti XML in dizionario in Python
Questo tutorial mostra come convertire una stringa XML in un dizionario in Python
In questa pagina
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.