Python - Traitement XML

XML est un langage portable et open source qui permet aux programmeurs de développer des applications qui peuvent être lues par d'autres applications, quel que soit le système d'exploitation et / ou le langage de développement.

Qu'est-ce que XML?

Le langage de balisage extensible (XML) est un langage de balisage semblable au HTML ou au SGML. Ceci est recommandé par le World Wide Web Consortium et disponible en tant que norme ouverte.

XML est extrêmement utile pour garder une trace de petites et moyennes quantités de données sans avoir besoin d'un backbone basé sur SQL.

Architectures et API d'analyseur XML

La bibliothèque standard Python fournit un ensemble minimal mais utile d'interfaces pour travailler avec XML.

Les deux API les plus basiques et les plus largement utilisées pour les données XML sont les interfaces SAX et DOM.

  • Simple API for XML (SAX)- Ici, vous enregistrez des rappels pour les événements d'intérêt, puis laissez l'analyseur parcourir le document. Ceci est utile lorsque vos documents sont volumineux ou que vous avez des limitations de mémoire, il analyse le fichier lorsqu'il le lit à partir du disque et le fichier entier n'est jamais stocké en mémoire.

  • Document Object Model (DOM) API - Il s'agit d'une recommandation du World Wide Web Consortium dans laquelle le fichier entier est lu en mémoire et stocké sous une forme hiérarchique (basée sur une arborescence) pour représenter toutes les fonctionnalités d'un document XML.

SAX ne peut évidemment pas traiter les informations aussi vite que le DOM peut le faire lorsqu'il travaille avec des fichiers volumineux. D'un autre côté, l'utilisation exclusive de DOM peut vraiment tuer vos ressources, surtout si elle est utilisée sur beaucoup de petits fichiers.

SAX est en lecture seule, tandis que DOM autorise les modifications du fichier XML. Étant donné que ces deux API différentes se complètent littéralement, il n'y a aucune raison pour que vous ne puissiez pas les utiliser toutes les deux pour de grands projets.

Pour tous nos exemples de code XML, utilisons un simple fichier XML movies.xml comme entrée -

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

Analyse XML avec les API SAX

SAX est une interface standard pour l'analyse XML basée sur les événements. L'analyse XML avec SAX vous oblige généralement à créer votre propre ContentHandler en sous-classant xml.sax.ContentHandler.

Votre ContentHandler gère les balises et attributs particuliers de votre (vos) saveur (s) de XML. Un objet ContentHandler fournit des méthodes pour gérer divers événements d'analyse. Son propre analyseur appelle les méthodes ContentHandler lorsqu'il analyse le fichier XML.

Les méthodes startDocument et endDocument sont appelées au début et à la fin du fichier XML. Les caractères de méthode (texte) sont transmis des données de caractère du fichier XML via le texte de paramètre.

Le ContentHandler est appelé au début et à la fin de chaque élément. Si l'analyseur n'est pas en mode espace de noms, les méthodes startElement (balise, attributs) et endElement (balise) sont appelées; sinon, les méthodes correspondantes startElementNS et endElementNS sont appelées. Ici, la balise est la balise d'élément et les attributs est un objet Attributes.

Voici d'autres méthodes importantes à comprendre avant de continuer -

La méthode make_parser

La méthode suivante crée un nouvel objet analyseur et le renvoie. L'objet analyseur créé sera du premier type d'analyseur détecté par le système.

xml.sax.make_parser( [parser_list] )

Voici le détail des paramètres -

  • parser_list - L'argument optionnel consistant en une liste d'analyseurs à utiliser qui doivent tous implémenter la méthode make_parser.

La méthode parse

La méthode suivante crée un analyseur SAX et l'utilise pour analyser un document.

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

Voici le détail des paramètres -

  • xmlfile - C'est le nom du fichier XML à lire.

  • contenthandler - Il doit s'agir d'un objet ContentHandler.

  • errorhandler - S'il est spécifié, errorhandler doit être un objet SAX ErrorHandler.

La méthode parseString

Il existe une autre méthode pour créer un analyseur SAX et analyser le XML string.

xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

Voici le détail des paramètres -

  • xmlstring - Il s'agit du nom de la chaîne XML à partir de laquelle lire.

  • contenthandler - Il doit s'agir d'un objet ContentHandler.

  • errorhandler - S'il est spécifié, errorhandler doit être un objet SAX ErrorHandler.

Exemple

#!/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")

Cela produirait le résultat suivant -

*****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

Pour un détail complet sur la documentation de l'API SAX, veuillez vous référer aux API Python SAX standard .

Analyser XML avec les API DOM

Le modèle d'objet de document ("DOM") est une API multilingue du World Wide Web Consortium (W3C) pour accéder et modifier des documents XML.

Le DOM est extrêmement utile pour les applications à accès aléatoire. SAX ne vous permet de visualiser qu'un seul bit du document à la fois. Si vous regardez un élément SAX, vous n'avez pas accès à un autre.

Voici le moyen le plus simple de charger rapidement un document XML et de créer un objet minidom à l'aide du module xml.dom. L'objet minidom fournit une méthode d'analyse simple qui crée rapidement une arborescence DOM à partir du fichier XML.

L'exemple de phrase appelle la fonction parse (file [, parser]) de l'objet minidom pour analyser le fichier XML désigné par file dans un objet d'arborescence 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

Cela produirait le résultat suivant -

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

Pour un détail complet sur la documentation de l'API DOM, veuillez vous référer aux API DOM Python standard .