Python 3 - 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 nella 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 usarle entrambe per progetti di grandi dimensioni.

Per tutti i nostri esempi di codice XML, utilizziamo 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 sottoclasse xml.sax.ContentHandler.

Il tuo ContentHandler gestisce i tag e gli attributi particolari dei tuoi gusti 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. I caratteri del metodo (testo) vengono passati ai 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, il sistema trova.

xml.sax.make_parser( [parser_list] )

Ecco i dettagli 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 metodo seguente crea un parser SAX e lo utilizza per analizzare un documento.

xml.sax.parse( xmlfile, contenthandler[, errorhandler])

Ecco i dettagli 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 i dettagli 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/python3

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")

Produzione

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 scientific 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 multilingua del World Wide Web Consortium (W3C) per l'accesso e la modifica dei 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 per 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.

Esempio

#!/usr/bin/python3

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)

Produzione

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 scientific 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 .