Python - Elaborazione XML
XML è un linguaggio portatile e open source che consente ai programmatori di sviluppare applicazioni che possono essere lette da altre applicazioni, indipendentemente dal sistema operativo e / o dal linguaggio di sviluppo.
Cos'è l'XML?
L'Extensible Markup Language (XML) è un linguaggio di markup molto simile a HTML o SGML. Questo è consigliato dal World Wide Web Consortium e disponibile come standard aperto.
XML è estremamente utile per tenere traccia di piccole e medie quantità di dati senza richiedere un backbone basato su SQL.
API e architetture di parser XML
La libreria standard Python fornisce un insieme minimo ma utile di interfacce per lavorare con XML.
Le due API più semplici e ampiamente utilizzate per i dati XML sono le interfacce SAX e DOM.
Simple API for XML (SAX)- Qui, registri i callback per gli eventi di interesse e poi lasci che il parser proceda attraverso il documento. Questo è utile quando i tuoi documenti sono di grandi dimensioni o hai limitazioni di memoria, analizza il file mentre lo legge dal disco e l'intero file non viene mai archiviato in memoria.
Document Object Model (DOM) API - Questa è una raccomandazione del World Wide Web Consortium in cui 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.
Ovviamente SAX non può elaborare le informazioni alla velocità di DOM quando si lavora con file di grandi dimensioni. D'altra parte, l'uso esclusivo di DOM può davvero uccidere le tue risorse, specialmente se usato su molti piccoli file.
SAX è di sola lettura, mentre DOM consente modifiche al file XML. Poiché queste due API diverse si completano letteralmente a vicenda, non c'è motivo per cui non puoi utilizzarle entrambe per progetti di grandi dimensioni.
Per tutti i nostri esempi di codice XML, usiamo un semplice file XML movies.xml come input -
<collection shelf="New Arrivals">
<movie title="Enemy Behind">
<type>War, Thriller</type>
<format>DVD</format>
<year>2003</year>
<rating>PG</rating>
<stars>10</stars>
<description>Talk about a US-Japan war</description>
</movie>
<movie title="Transformers">
<type>Anime, Science Fiction</type>
<format>DVD</format>
<year>1989</year>
<rating>R</rating>
<stars>8</stars>
<description>A schientific fiction</description>
</movie>
<movie title="Trigun">
<type>Anime, Action</type>
<format>DVD</format>
<episodes>4</episodes>
<rating>PG</rating>
<stars>10</stars>
<description>Vash the Stampede!</description>
</movie>
<movie title="Ishtar">
<type>Comedy</type>
<format>VHS</format>
<rating>PG</rating>
<stars>2</stars>
<description>Viewable boredom</description>
</movie>
</collection>
Analisi XML con API SAX
SAX è un'interfaccia standard per l'analisi XML guidata dagli eventi. L'analisi di XML con SAX generalmente richiede di creare il proprio ContentHandler sottoclassando xml.sax.ContentHandler.
Il tuo ContentHandler gestisce i tag e gli attributi particolari delle tue versioni di XML. Un oggetto ContentHandler fornisce metodi per gestire vari eventi di analisi. Il suo parser di proprietà chiama i metodi ContentHandler mentre analizza il file XML.
I metodi startDocument e endDocument vengono chiamati all'inizio e alla fine del file XML. Ai caratteri del metodo (testo) vengono passati i dati dei caratteri del file XML tramite il testo del parametro.
ContentHandler viene chiamato all'inizio e alla fine di ogni elemento. Se il parser non è in modalità spazio dei nomi, vengono chiamati i metodi startElement (tag, attributi) e endElement (tag) ; in caso contrario, vengono chiamati i metodi corrispondenti startElementNS e endElementNS . In questo caso, tag è il tag dell'elemento e attributes è un oggetto Attributes.
Ecco altri metodi importanti da capire prima di procedere:
Il metodo make_parser
Il metodo seguente crea un nuovo oggetto parser e lo restituisce. L'oggetto parser creato sarà del primo tipo di parser trovato dal sistema.
xml.sax.make_parser( [parser_list] )
Ecco il dettaglio dei parametri -
parser_list - L'argomento opzionale costituito da un elenco di parser da utilizzare che devono implementare tutti il metodo make_parser.
Il metodo di analisi
Il seguente metodo crea un parser SAX e lo utilizza per analizzare un documento.
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
Ecco il dettaglio dei parametri -
xmlfile - Questo è il nome del file XML da cui leggere.
contenthandler - Deve essere un oggetto ContentHandler.
errorhandler - Se specificato, il gestore degli errori deve essere un oggetto SAX ErrorHandler.
Il metodo parseString
C'è un altro metodo per creare un parser SAX e per analizzare il file specificato XML string.
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
Ecco il dettaglio dei parametri -
xmlstring - Questo è il nome della stringa XML da cui leggere.
contenthandler - Deve essere un oggetto ContentHandler.
errorhandler - Se specificato, il gestore degli errori deve essere un oggetto SAX ErrorHandler.
Esempio
#!/usr/bin/python
import xml.sax
class MovieHandler( xml.sax.ContentHandler ):
def __init__(self):
self.CurrentData = ""
self.type = ""
self.format = ""
self.year = ""
self.rating = ""
self.stars = ""
self.description = ""
# Call when an element starts
def startElement(self, tag, attributes):
self.CurrentData = tag
if tag == "movie":
print "*****Movie*****"
title = attributes["title"]
print "Title:", title
# Call when an elements ends
def endElement(self, tag):
if self.CurrentData == "type":
print "Type:", self.type
elif self.CurrentData == "format":
print "Format:", self.format
elif self.CurrentData == "year":
print "Year:", self.year
elif self.CurrentData == "rating":
print "Rating:", self.rating
elif self.CurrentData == "stars":
print "Stars:", self.stars
elif self.CurrentData == "description":
print "Description:", self.description
self.CurrentData = ""
# Call when a character is read
def characters(self, content):
if self.CurrentData == "type":
self.type = content
elif self.CurrentData == "format":
self.format = content
elif self.CurrentData == "year":
self.year = content
elif self.CurrentData == "rating":
self.rating = content
elif self.CurrentData == "stars":
self.stars = content
elif self.CurrentData == "description":
self.description = content
if ( __name__ == "__main__"):
# create an XMLReader
parser = xml.sax.make_parser()
# turn off namepsaces
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
# override the default ContextHandler
Handler = MovieHandler()
parser.setContentHandler( Handler )
parser.parse("movies.xml")
Ciò produrrebbe il seguente risultato:
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2003
Rating: PG
Stars: 10
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
Description: Viewable boredom
Per un dettaglio completo sulla documentazione dell'API SAX, fare riferimento alle API SAX Python standard .
Analisi XML con API DOM
Il Document Object Model ("DOM") è un'API cross-language del World Wide Web Consortium (W3C) per l'accesso e la modifica di documenti XML.
Il DOM è estremamente utile per le applicazioni ad accesso casuale. SAX ti consente solo una visualizzazione di un bit del documento alla volta. Se stai guardando un elemento SAX, non hai accesso a un altro.
Ecco il modo più semplice per caricare rapidamente un documento XML e creare un oggetto minidom utilizzando il modulo xml.dom. L'oggetto minidom fornisce un semplice metodo parser che crea rapidamente un albero DOM dal file XML.
La frase di esempio chiama la funzione parse (file [, parser]) dell'oggetto minidom per analizzare il file XML designato da file in un oggetto albero DOM.
#!/usr/bin/python
from xml.dom.minidom import parse
import xml.dom.minidom
# Open XML document using minidom parser
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
print "Root element : %s" % collection.getAttribute("shelf")
# Get all the movies in the collection
movies = collection.getElementsByTagName("movie")
# Print detail of each movie.
for movie in movies:
print "*****Movie*****"
if movie.hasAttribute("title"):
print "Title: %s" % movie.getAttribute("title")
type = movie.getElementsByTagName('type')[0]
print "Type: %s" % type.childNodes[0].data
format = movie.getElementsByTagName('format')[0]
print "Format: %s" % format.childNodes[0].data
rating = movie.getElementsByTagName('rating')[0]
print "Rating: %s" % rating.childNodes[0].data
description = movie.getElementsByTagName('description')[0]
print "Description: %s" % description.childNodes[0].data
Ciò produrrebbe il seguente risultato:
Root element : New Arrivals
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Rating: PG
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Rating: R
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Description: Viewable boredom
Per un dettaglio completo sulla documentazione dell'API DOM, fare riferimento alle API DOM Python standard .