Quante volte ci è capitato di dover salvare dei dati su un file e essere costretti, ogni volta, a scrivere determinate funzioni per ricavare i dati scritti? A me tante volte, e come esperienza personale ho deciso di scrivere questa mini guida per Python!
Banalmente, Wikipedia, ci suggerisce che XML è un linguaggio marcatore che definisce un meccanismo sintattico che consente di estendere o controllare il significato di altri linguaggi marcatori. In poche parole mediante una struttura testuale molto semplice ed intuitiva dove possiamo immagazzinare dei dati. Ma se meglio vogliamo definirlo: è uno standard di descrizione di documenti. Attualmente molti programmi fanno uso di questa comodità per salvare configurazioni o dati nei file. Ad esempio i Feed RSS sfruttano l’XML per rendere reperibili i nostri contenuti.Ma veniamo subito ai fatti: Analizziamo un semplice codice XML e vediamo come Python può analizzarlo. Qui di seguito riporto un esempio:
<sitiweb>
<sitoweb name="iKoala" type="Blog">
<indirizzo>http://www.koalalorenzo.com</indirizzo>
<autore>Lorenzo Setale</autore>
</sitoweb>
<sitoweb name="Google" type="Motore di ricerca">
<indirizzo>http://www.google.it</indirizzo>
<autore>Larry Page and Sergey Brin</autore>
</sitoweb>
</sitiweb>
In questo semplice codice ho inserito una lista di siti web, e per ognuno di essi ho specificato l’indirizzo e l’autore. Ho salvato questo testo in un file che ho chiamato siti.xml. Vediamo ora un semplice codice Python per analizzarlo e ottenere i dati salvati. Quindi apriamo un editor di testo ed iniziamo a digitare il seguente codice: (ma anche copia&incolla dovrebbe andare bene
)
from xml.dom.minidom import parse, parseString
parser = parse("siti.xml")
dati = dict()
for siti in parser.getElementsByTagName("sitiweb"):
for sito in siti.getElementsByTagName("sitoweb"):
name = sito.getAttribute("name")
type = sito.getAttribute("type")
autore = None
indirizzo = None
for ninnolo in sito.getElementsByTagName("indirizzo"):
for xo in ninnolo.childNodes:
indirizzo = xo.data
for ninnolo in sito.getElementsByTagName("autore"):
for xo in ninnolo.childNodes:
autore = xo.data
dati[name] = { "type": type, "autore": autore, "indirizzo": indirizzo }
print dati
Se salviamo il contenuto qui sopra riportato, in un file chiamato myxml.py e lo avviamo con il comando python ./myxml.py ci verrà mostrato a schermo un dizionario python. Quindi vedrete più o meno questo:
{
'Google': {
'autore': u'Larry Page and Sergey Brin',
'indirizzo': u'http://www.google.it',
'type': u'Motore di ricerca'
},
'iKoala': {
'autore': u'Lorenzo Setale',
'indirizzo': u'http://www.koalalorenzo.com',
'type': u'Blog'
}
}
Ora analizziamo brevemente il funzionamento del codice python sopra riportato.
Per prima cosa abbiamo importato il necessario ed abbiamo fatto analizzare il file “site.xml” mediante la funzione parse. Successivamente abbiamo dichiarato un dizionario che contiene i dati ottenuti. Abbiamo poi avviato dei cicli che analizzano ogni elemento dell’XML inserendo i dati ottenuti nel dizionario. Successivamente abbiamo stampato a schermo il dizionario ottenuto.
Se volessimo migliorare l’output dei dati ottenuti potremmo aggiungere il seguente codice al file myxml.py . Ricordiamoci di cancellare l’ultima riga contenente “print dati” in modo da non mostrare il dizionario grezzo. Quindi digitiamo:
for name in dati.keys():
print name, "=", dati[name]["type"]
print " Autore:", dati[name]["autore"]
print " Indirizzo:", dati[name]["indirizzo"]
Così facendo i nostri dati, invece di essere mostrati come un dizionario da noi poco comprensibile, saranno mostrati a schermo in questo modo:
Google = Motore di ricerca Autore: Larry Page and Sergey Brin Indirizzo: http://www.google.it iKoala = Blog Autore: Lorenzo Setale Indirizzo: http://www.koalalorenzo.com
Come potete vedere, analizzando le chiavi del dizionario abbiamo potuto ricavarci tutti i dati del dizionario che prima erano contenute nel file XML! Sentitevi liberi, ora, di modificare il codice e di applicarlo tranquillamente alle vostre esigenze!

