Persistenza dei dati Python - Parser XML
XML è l'acronimo di eXtensible Markup Language. È un linguaggio portabile, open source e multipiattaforma molto simile a HTML o SGML e raccomandato dal World Wide Web Consortium.
È un noto formato di scambio di dati, utilizzato da un gran numero di applicazioni come servizi Web, strumenti per ufficio e Service Oriented Architectures(SOA). Il formato XML è leggibile sia dalla macchina che dall'uomo.
Il pacchetto xml della libreria Python standard è costituito dai seguenti moduli per l'elaborazione XML:
Sr.No. | Moduli e descrizione |
---|---|
1 |
xml.etree.ElementTree l'API ElementTree, un processore XML semplice e leggero |
2 |
xml.dom la definizione dell'API DOM |
3 |
xml.dom.minidom un'implementazione DOM minima |
4 |
xml.sax Implementazione dell'interfaccia SAX2 |
5 |
xml.parsers.expat l'associazione del parser Expat |
I dati nel documento XML sono organizzati in un formato gerarchico ad albero, a partire dalla radice e dagli elementi. Ogni elemento è un singolo nodo dell'albero e ha un attributo racchiuso tra i tag <> e </>. Uno o più sottoelementi possono essere assegnati a ciascun elemento.
Di seguito è riportato un tipico esempio di un documento XML:
<?xml version = "1.0" encoding = "iso-8859-1"?>
<studentlist>
<student>
<name>Ratna</name>
<subject>Physics</subject>
<marks>85</marks>
</student>
<student>
<name>Kiran</name>
<subject>Maths</subject>
<marks>100</marks>
</student>
<student>
<name>Mohit</name>
<subject>Biology</subject>
<marks>92</marks>
</student>
</studentlist>
Durante l'utilizzo ElementTreemodulo, il primo passo è impostare l'elemento radice dell'albero. Ogni elemento ha un tag e un attrib che è un oggetto dict. Per l'elemento radice, un attrib è un dizionario vuoto.
import xml.etree.ElementTree as xmlobj
root=xmlobj.Element('studentList')
Ora possiamo aggiungere uno o più elementi sotto l'elemento root. Ogni oggetto elemento può avereSubElements. Ogni sottoelemento ha un attributo e una proprietà di testo.
student=xmlobj.Element('student')
nm=xmlobj.SubElement(student, 'name')
nm.text='name'
subject=xmlobj.SubElement(student, 'subject')
nm.text='Ratna'
subject.text='Physics'
marks=xmlobj.SubElement(student, 'marks')
marks.text='85'
Questo nuovo elemento viene aggiunto alla radice utilizzando il metodo append ().
root.append(student)
Aggiungi tutti gli elementi desiderati usando il metodo sopra. Infine, l'oggetto elemento radice viene scritto in un file.
tree = xmlobj.ElementTree(root)
file = open('studentlist.xml','wb')
tree.write(file)
file.close()
Ora vediamo come analizzare il file XML. Per questo, costruisci un albero del documento dando il suo nome come parametro file nel costruttore ElementTree.
tree = xmlobj.ElementTree(file='studentlist.xml')
L'oggetto albero ha getroot() metodo per ottenere l'elemento root e getchildren () restituisce un elenco di elementi sottostanti.
root = tree.getroot()
children = root.getchildren()
Un oggetto dizionario corrispondente a ogni sottoelemento viene costruito iterando sulla raccolta di sottoelementi di ogni nodo figlio.
for child in children:
student={}
pairs = child.getchildren()
for pair in pairs:
product[pair.tag]=pair.text
Ogni dizionario viene quindi aggiunto a un elenco che restituisce l'elenco originale di oggetti dizionario.
SAXè un'interfaccia standard per l'analisi XML guidata dagli eventi. L'analisi di XML con SAX richiede ContentHandler mediante la sottoclasse xml.sax.ContentHandler. Si registrano i callback per gli eventi di interesse e quindi si lascia che il parser proceda attraverso il documento.
SAX è utile quando i tuoi documenti sono di grandi dimensioni o hai limitazioni di memoria poiché analizza il file mentre lo legge dal disco, di conseguenza l'intero file non viene mai archiviato nella memoria.
Document Object Model
(DOM) API è una raccomandazione del World Wide Web Consortium. In questo caso, l'intero file viene letto in memoria e archiviato in una forma gerarchica (basata su albero) per rappresentare tutte le caratteristiche di un documento XML.
SAX, non veloce come DOM, con file di grandi dimensioni. D'altra parte, DOM può uccidere le risorse, se utilizzato su molti file di piccole dimensioni. SAX è di sola lettura, mentre DOM consente modifiche al file XML.