Analyse XML en Python


Qu'est-ce que XML ?

XML fait référence à l'Extensible Markup Language (eXtensible Markup Lxtensible Markup Language).Tutoriel XML

XML est conçu pour transmettre et stocker des données.

XML est un ensemble de règles pour définir un balisage sémantique qui divise un document en plusieurs parties et identifie ces parties.

C'est aussi un méta-langage de balisage, c'est-à-dire un langage syntaxique utilisé pour définir d'autres langages de balisage sémantiques et structurés liés à des domaines spécifiques.


Analyse XML avec Python

Les interfaces de programmation XML courantes incluent DOM et SAX. Ces deux interfaces traitent les fichiers XML différemment et, bien sûr, elles sont utilisées dans des situations différentes.

Python propose trois méthodes pour analyser du XML : SAX, DOM et ElementTree :

1.SAX (API simple pour XML )

La bibliothèque standard de Python inclut un analyseur SAX. SAX utilise un modèle événementiel, en traitant les fichiers XML par déclenchement d'événements un par un pendant l'analyse XML et en appelant des fonctions de rappel définies par l'utilisateur.

2.DOM (Document Object Model)

Analyser les données XML en un arbre en mémoire, et opérer sur le XML en manipulant l'arbre.

3. ElementTree (arbre d'éléments)

ElementTree est comme un DOM léger avec une API pratique et conviviale. Il offre une bonne utilisabilité du code, une grande rapidité et une faible consommation de mémoire.

Remarque :Parce que DOM doit mapper les données XML vers un arbre en mémoire, il est relativement lent et gourmand en mémoire. SAX lit les fichiers XML en flux, ce qui est plus rapide et utilise moins de mémoire, mais nécessite que les utilisateurs implémentent des fonctions de rappel (gestionnaires).

Le contenu du fichier d'exemple XML movies.xml utilisé dans ce chapitre est le suivant :

movies.xml

<collection shelf="Nouveautés"> <movie titre="Enemy Behind"> <type>Guerre, Thriller</type> <format>DVD</format> <année>2003</année> <classification>PG</classification> <étoiles>10</étoiles> <description>Parle d'une guerre entre les États-Unis et le Japon</description> </film> <film titre="Transformers"> <type>Anime, Science-fiction</type> <format>DVD</format> <année>1989</année> <classification>R</classification> <étoiles>8</étoiles> <description>Une fiction scientifique</description> </film> <film titre="Trigun"> <type>Anime, Action</type> <format>DVD</format> <épisodes>4</épisodes> <classification>PG</classification> <étoiles>10</étoiles> <description>Vash the Stampede!</description> </film> <film titre="Ishtar"> <type>Comédie</type> <format>VHS</format> <classification>PG</note> <étoiles>2</étoiles> <description>Ennui regardable</description> </film> </collection>

Python utilise SAX pour analyser XML

SAX est une API événementielle.

L'analyse de documents XML avec SAX implique deux parties :AnalyseuretGestionnaire d'événements。

L'analyseur est chargé de lire le document XML et d'envoyer des événements au gestionnaire d'événements, tels que les événements de début et de fin d'élément.

Le gestionnaire d'événements est chargé de répondre aux événements et de traiter les données XML transmises.

  • 1. Traiter des fichiers volumineux ;
  • 2. N’avoir besoin que d’une partie du contenu du fichier, ou uniquement d’informations spécifiques provenant du fichier.
  • 3. Lorsque vous souhaitez construire votre propre modèle objet.

Pour traiter du XML avec SAX en Python, vous devez d’abord importer la fonction parse depuis xml.sax et ContentHandler depuis xml.sax.handler.

Introduction aux méthodes de la classe ContentHandler

méthode characters(content)

Moment de l’invocation :

Depuis le début de la ligne, avant de rencontrer une balise, s’il y a des caractères, la valeur de content est constituée de ces chaînes.

À partir d’une balise, avant de rencontrer la balise suivante, s’il y a des caractères, la valeur de content est constituée de ces chaînes.

À partir d’une balise, avant de rencontrer le terminateur de ligne, s’il y a des caractères, la valeur de content est constituée de ces chaînes.

La balise peut être une balise de début ou une balise de fin.

méthode startDocument()

Appelée lorsque le document commence.

méthode endDocument()

Appelée lorsque le parseur atteint la fin du document.

méthode startElement(name, attrs)

Appelée lorsqu'une balise de début XML est rencontrée. name est le nom de la balise, et attrs est un dictionnaire des valeurs d'attributs de la balise.

méthode endElement(name)

Appelée lorsqu'une balise de fin XML est rencontrée.


méthode make_parser

La méthode suivante crée un nouvel objet parseur et le renvoie.

xml.sax.make_parser( [parser_list] )

Description du paramètre :

  • parser_list- Paramètre facultatif, liste de parseurs

méthode parser

La méthode suivante crée un parseur SAX et analyse un document XML :

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

Description du paramètre :

  • xmlfile- nom du fichier XML
  • contenthandler- Doit être un objet ContentHandler
  • errorhandler- Si ce paramètre est spécifié, errorhandler doit être un objet SAX ErrorHandler

méthode parseString

La méthode parseString crée un analyseur XML et analyse une chaîne XML :

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

Description du paramètre :

  • xmlstring- chaîne XML
  • contenthandler- Doit être un objet ContentHandler
  • errorhandler- Si ce paramètre est spécifié, errorhandler doit être un objet SAX ErrorHandler

Exemple d'analyse XML en Python

Exemple

#!/usr/bin/python # -*- coding: UTF-8 -*- 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 = "" # Gestion de l'événement de début d'élément def startElement(self, tag, attributes): self.CurrentData = tag if tag == "movie": print "*****Film*****" title = attributes["title"] print "Titre :", title # Gestion de l'événement de fin d'élément 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 "Année :", self.year elif self.CurrentData == "rating": print "Note :", self.rating elif self.CurrentData == "stars": print "Étoiles :", self.stars elif self.CurrentData == "description": print "Description :", self.description self.CurrentData = "" # Gestion des événements de contenu 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__"): # Créer un XMLReader parser = xml.sax.make_parser() # désactiver les espaces de noms parser.setFeature(xml.sax.handler.feature_namespaces, 0) # Redéfinir ContextHandler Handler = MovieHandler() parser.setContentHandler( Handler ) parser.parse("movies.xml")

Le résultat d'exécution du code ci-dessus est le 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

Veuillez vous référer à la documentation complète de l'API SAXAPI SAX Python


Utilisation de xml.dom pour analyser du XML

Le Document Object Model (DOM) est une interface de programmation standard recommandée par le W3C pour le traitement du langage de balisage extensible.

Lorsqu'un analyseur DOM analyse un document XML, il lit l'intégralité du document en une seule fois et stocke tous les éléments dans une structure arborescente en mémoire. Ensuite, vous pouvez utiliser différentes fonctions fournies par DOM pour lire ou modifier le contenu et la structure du document, et vous pouvez également écrire le contenu modifié dans un fichier XML.

En Python, xml.dom.minidom est utilisé pour analyser des fichiers XML. Un exemple est le suivant :

Exemple

#!/usr/bin/python # -*- coding: UTF-8 -*- from xml.dom.minidom import parse import xml.dom.minidom # Ouvrir le document XML à l'aide du parseur minidom DOMTree = xml.dom.minidom.parse("movies.xml") collection = DOMTree.documentElement if collection.hasAttribute("shelf"): print "Élément racine : %s" % collection.getAttribute("shelf") # Obtenir tous les films de la collection movies = collection.getElementsByTagName("movie") # Afficher les informations détaillées pour chaque film for movie in movies: print "*****Film*****" if movie.hasAttribute("title"): print "Titre : %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

Le résultat de l'exécution du programme ci-dessus est le 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

Veuillez vous référer à la documentation complète de l'API DOMAPI DOM Python。

Autres extensions