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