Oggi impareremo come convertire XML in JSON e XML in Dict in Python. Possiamo utilizzare il modulo python xmltodict
per leggere il file XML e convertirlo in dati Dict o JSON. Possiamo anche eseguire la conversione di grandi file XML in modo efficiente. Prima di iniziare con la parte di codifica, cerchiamo di capire perché è necessaria la conversione XML.
Conversione XML in Dict/JSON
I file XML stanno diventando obsoleti, ma ci sono ancora molti sistemi web che utilizzano questo formato. XML è più pesante di JSON e per questo motivo la maggior parte degli sviluppatori preferisce quest’ultimo nelle loro applicazioni. Quando le applicazioni devono comprendere l’XML fornito da una fonte, può essere un compito noioso convertirlo in JSON. Il modulo xmltodict
in Python rende questa operazione estremamente facile e diretta da eseguire.
Iniziare con xmltodict
Possiamo iniziare con il modulo xmltodict
, ma prima dobbiamo installarlo. Useremo principalmente pip per eseguire l’installazione.
Installa il modulo xmltodict
Ecco come possiamo installare il modulo xmltodict usando Python Package Index (pip):
pip install xmltodict
Questo verrà fatto rapidamente poiché xmltodict
è un modulo molto leggero. Ecco l’output di questa installazione: La cosa migliore di questa installazione è che il modulo non dipende da nessun altro modulo esterno, quindi è leggero e evita conflitti di versione. Solo a titolo dimostrativo, nei sistemi basati su Debian, questo modulo può essere facilmente installato usando lo strumento
apt
:
sudo apt install python-xmltodict
Un altro punto a favore è che questo modulo ha un pacchetto Debian ufficiale.
Python XML to JSON
Il posto migliore per iniziare a provare questo modulo è eseguire un’operazione per cui è stato creato principalmente, ovvero convertire XML in JSON. Vediamo uno snippet di codice su come fare questo:
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)))
Vediamo l’output per questo programma: Qui, semplicemente utilizziamo la funzione
parse(...)
per convertire i dati XML in JSON e quindi utilizziamo il modulo json
per stampare il JSON in un formato migliore.
Conversione di un file XML in JSON
Conservare i dati XML nel codice stesso non è sempre possibile né realistico. Di solito, manteniamo i nostri dati in un database o in alcuni file. Possiamo anche selezionare direttamente i file e convertirli in JSON. Vediamo uno snippet di codice su come eseguire la conversione con un file 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))
Vediamo l’output per questo programma: Qui, abbiamo utilizzato un altro modulo pprint per stampare l’output in modo formattato. Oltre a ciò, l’utilizzo della funzione
open(...)
è stato semplice, l’abbiamo utilizzata per ottenere un descrittore di file e quindi abbiamo analizzato il file in un oggetto JSON.
Python XML to Dict
Come suggerisce il nome del modulo stesso, xmltodict converte effettivamente i dati XML forniti in un semplice dizionario Python. Quindi, possiamo accedere ai dati anche con le chiavi del dizionario. Ecco un esempio di programma:
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'])
Vediamo l’output di questo programma: Quindi, i tag possono essere utilizzati come chiavi insieme alle chiavi degli attributi. Le chiavi degli attributi devono essere precedute dal simbolo
@
.
Supporto dei namespace in XML
Nelle informazioni XML, di solito abbiamo un insieme di namespace che definiscono la portata dei dati forniti dal file XML. Durante la conversione nel formato JSON, è quindi necessario che questi namespace persistano anche nel formato JSON. Consideriamo questo esempio di file XML:
<root xmlns="https://defaultns.com/"
xmlns:a="https://a.com/">
<audience>
<id what="attribute">123</id>
<name>Shubham</name>
</audience>
</root>
Ecco un esempio di programma su come possiamo includere i namespace XML anche nel formato JSON:
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))
Vediamo l’output di questo programma:
Conversione da JSON a XML
Sebbene la conversione da XML a JSON sia l’obiettivo principale di questo modulo, xmltodict supporta anche l’operazione inversa, la conversione da JSON a XML. Forniremo i dati JSON direttamente nel programma. Ecco un programma di esempio:
import xmltodict
student = {
"data" : {
"name" : "Shubham",
"marks" : {
"math" : 92,
"english" : 99
},
"id" : "s387hs3"
}
}
print(xmltodict.unparse(student, pretty=True))
Vediamo l’output di questo programma: Si noti che è necessario fornire una singola chiave JSON affinché funzioni correttamente. Se consideriamo di modificare il programma per contenere più chiavi JSON al primo livello dei dati, come ad esempio:
import xmltodict
student = {
"name" : "Shubham",
"marks" : {
"math" : 92,
"english" : 99
},
"id" : "s387hs3"
}
print(xmltodict.unparse(student, pretty=True))
In questo caso, abbiamo tre chiavi al livello radice. Se proviamo a trasformare questo tipo di JSON in XML, ci troveremo di fronte a questo errore: Questo accade perché xmltodict ha bisogno di costruire il JSON con la prima chiave come tag XML radice. Ciò significa che deve esserci solo una singola chiave JSON al livello radice dei dati.
Conclusioni
In questa lezione, abbiamo studiato un eccellente modulo Python che può essere utilizzato per analizzare e convertire XML in JSON e viceversa. Abbiamo anche imparato come convertire XML in un dizionario utilizzando il modulo xmltodict. Riferimenti: Documentazione API
Source:
https://www.digitalocean.com/community/tutorials/python-xml-to-json-dict