Parsing XML in Python
Oggi vediamo come fare il parsing di un file XML tramite Python.
Partiamo da un file XML così composto:
<?xml version="1.0" encoding="UTF-8"?>
<clienti>
<cliente>
<CODICE></CODICE>
<RAGSOC></RAGSOC>
<EMAIL></EMAIL>
</cliente>
</clienti>
Per fare il parsing useremo il modulo minidom, ma non è ovviamente l'unico modo per farlo.
Però usando minidom è veramente molto semplice.
Ecco la nostra classe:
from xml.dom import minidom
class XmlFile(object):
def readFile(self):
xmlDoc = minidom.parse('clienti.xml')
cliente = xmlDoc.getElementsByTagName("cliente")
tabella = []
for c in cliente:
codice = c.getElementsByTagName('CODICE')[0]
ragSoc = c.getElementsByTagName('RAGSOC')[0]
email = c.getElementsByTagName('EMAIL')[0]
list = []
list.append(codice.firstChild.data)
list.append(ragSoc.firstChild.data)
if email.firstChild is None:
list.append('')
else:
list.append(email.firstChild.data)
tabella.append(list)
return tabella
if __name__ == "__main__":
f = XmlFile()
print(f.readFile())
Qui non ci limitiamo a stampare record per record, ma a creare una struttura a "tabella" che poi può essere utile anche per riempire eventuali componenti grafici a tabella (tipo le wxpython Grid).
Come potete notare voi stessi, è tutto molto semplice.
Prima indichiamo il file da aprire (io non l'ho messo, ma bisognerebbe fare un controllo sull'esistenza del file, a meno che non glielo passate in altro modo).
Poi identifichiamo i vari tag cliente, e su ognuno troviamo i tag interni attraverso il metodo getElementsByTagName.
Nel ciclo ho impostato anche un controllo su un tag (email) per vedere se c'è un valore o meno; infatti in caso di tag vuoto, viene restituito un errore e il programma va in crash (e nel mio file, preso da un esempio reale, i tag possono essere vuoti).
Creiamo varie liste e le aggiungiamo alla lista finale, che si presenterà come una tabella.
Enjoy!
python xml minidom getelementbytagname tag
1 Commenti
Ciao matteo ho un file xml da 5gb non mi riesce di parsarlo con quasi nessuna libreria di python , pensi ci sia una soluzione o una particolare configurazione per riuscirci ? mi va in out of memory :(
05/05/2021