Python - Traitement XML
Page PrécédentePage Suivante
XML est un langage open source portable qui permet aux programmeurs de développer des applications pouvant ê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 similaire à HTML ou 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.
-
API simple pour XML (SAX) − Ici, vous enregistrez des rappels pour les événements qui vous intéressent, 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 au fur et à mesure qu'il le lit à partir du disque et le fichier entier n'est jamais stocké en mémoire.
-
API de modèle d'objet de document (DOM) − Il s'agit d'une recommandation du World Wide Web Consortium selon laquelle le fichier entier est lu en mémoire et stocké sous une forme hiérarchique (arborescente) pour représenter toutes les caractéristiques d'un document XML.
SAX ne peut évidemment pas traiter les informations aussi rapidement que DOM lorsqu'il travaille avec des fichiers volumineux. D'un autre côté, l'utilisation exclusive de DOM peut vraiment tuer vos ressources, surtout si vous l'utilisez sur un grand nombre de petits fichiers.
SAX est en lecture seule, tandis que DOM permet de modifier le 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 pilotée par les événements. L'analyse XML avec SAX nécessite généralement que vous créiez votre propre ContentHandler en sous-classant xml.sax.ContentHandler.
Votre gestionnaire de contenu gère les balises et les attributs particuliers de votre ou vos version(s) de XML. Un objet ContentHandler fournit des méthodes pour gérer divers événements d'analyse. Son analyseur propriétaire appelle les méthodes ContentHandler lorsqu'il analyse le fichier XML.
Les méthodes startDocument et endDocument sont appelés au début et à la fin du fichier XML. La méthode characters(text) sont transmises les données textuelles du fichier XML via le paramètre texte.
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(tag, attributs) et endElement(tag) sont appelés; sinon, les méthodes correspondantes startElementNS et endElementNS sont appelés. Ici, tag est la balise de l'élément, et attributes est un objet Attributes.
Voici d'autres méthodes importantes à comprendre avant de continuer −
Le make_parser Méthode
La méthode suivante crée un nouvel objet analyseur et le renvoie. L'objet analyseur créé sera du premier type d'analyseur trouvé 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.
L'analyse Méthode
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 −
-
fichier xml − C'est le nom du fichier XML à lire.
-
gestionnaire de contenu − Il doit s'agir d'un objet ContentHandler.
-
gestionnaire d'erreurs − Si spécifié, errorhandler doit être un objet SAX ErrorHandler.
La parseString Méthode
Il existe une autre méthode pour créer un analyseur SAX et analyser la chaîne XML spécifiée .
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
Voici le détail des paramètres −
-
chaîne xml − Il s'agit du nom de la chaîne XML à lire.
-
gestionnaire de contenu − Il doit s'agir d'un objet ContentHandler.
-
gestionnaire d'erreurs − Si 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.
Analyse XML avec les API DOM
Le Document Object Model ("DOM") est une API multilingue du World Wide Web Consortium (W3C) permettant d'accéder et de modifier des documents XML.
Le DOM est extrêmement utile pour les applications à accès aléatoire. SAX ne vous permet de voir 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 arborescent 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 Python DOM standard.
Python