Python3 Analyse XML


Qu'est-ce que XML ?

XML fait référence à l'Extensible Markup Language (eXtensible Markup Lxtensible Markup Language), un sous-ensemble du Standard Generalized Markup Language, et est un langage de balisage utilisé pour baliser des fichiers électroniques afin qu'ils soient structurés. Vous pouvez apprendre depuis ce siteTutoriel XML

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

XML est un ensemble de règles pour définir des balises sémantiques. Ces balises divisent un document en plusieurs parties et identifient 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 de Python

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

Python dispose de trois méthodes pour analyser du XML : ElementTree, SAX et DOM.

1. ElementTree

xml.etree.ElementTree est un module de la bibliothèque standard Python pour gérer XML. Il fournit une API simple et efficace pour analyser et générer des documents XML.

2.SAX (API simple pour XML )

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

3.DOM(Modèle d'objet de document)

Il analyse les données XML dans un arbre en mémoire et opère sur XML en manipulant l'arbre.

Les fichiers d'exemple XML utilisés dans ce chapitremovies.xmlLe contenu est le suivant :

Exemples

<collection shelf="Nouveautés">
<movie title="Ennemi caché">
   <type>Guerre, Thriller</type>
   <format>DVD</format>
   <year>2003</year>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Parler d'une guerre entre les États-Unis et le Japon</description>
</movie>
<movie title="Transformers">
   <type>Anime, Science-Fiction</type>
   <format>DVD</format>
   <year>1989</year>
   <rating>R</rating>
   <stars>8</stars>
   <description>Une fiction scientifique</description>
</movie>
   <movie title="Trigun">
   <type>Anime, Action</type>
   <format>DVD</format>
   <episodes>4</episodes>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Vash le Stampede!</description>
</movie>
<movie title="Ishtar">
   <type>Comédie</type>
   <format>VHS</format>
   <rating>PG</rating>
   <stars>2</stars>
   <description>Ennui regardable</description>
</movie>
</collection>

Python utilise ElementTree pour analyser XML

xml.etree.ElementTreeest un module de la bibliothèque standard Python pour manipuler XML.

Voici quelques concepts clés et utilisations du module xml.etree.ElementTree :

Objets ElementTree et Element :

  • ElementTree: La classe ElementTree est une représentation arborescente d'un document XML. Elle contient un ou plusieurs objets Element et représente le document XML entier.
  • Element: L'objet Element représente un élément dans un document XML. Chaque élément possède une balise, un ensemble d'attributs et zéro ou plusieurs éléments enfants.

Analyse XML

méthode fromstring(): Vous pouvez utiliser la méthode fromstring() pour convertir une chaîne contenant des données XML en un objet Element :

Exemple

import xml.etree.ElementTree as ET

xml_string = '<root><element>Some data</element></root>'
root = ET.fromstring(xml_string)

méthode parse(): Si les données XML sont stockées dans un fichier, vous pouvez utiliser la méthode parse() pour analyser l'intégralité du document XML :

tree = ET.parse('example.xml')
root = tree.getroot()

Parcours de l'arbre XML

méthode find(): Utilisez la méthode find() pour trouver le premier élément enfant avec la balise spécifiée :

title_element = root.find('title')

méthode findall(): Utilisez la méthode findall() pour trouver tous les éléments enfants avec la balise spécifiée :

book_elements = root.findall('book')

Accès aux attributs et au contenu textuel d'un élément

attribAttribut : Vous pouvez accéder aux attributs d'un élément via l'attribut attrib :

price = book_element.attrib['price']

textContenu textuel : Vous pouvez accéder au contenu textuel de l'élément via l'attribut text :

title_text = title_element.text

Création de XML

constructeur Element(): Utilisez le constructeur Element() pour créer un nouvel élément :

new_element = ET.Element('new_element')

Fonction SubElement(): Utilisez la fonction SubElement() pour créer un élément enfant avec la balise spécifiée :

new_sub_element = ET.SubElement(root, 'new_sub_element')

Modification de XML

Modifier les attributs et le contenu texte de l'élément : modifiez directement les attributs attrib et text de l'élément.

Supprimer un élément : vous pouvez supprimer un élément à l'aide de la méthode remove() :

root.remove(title_element)

Lecture simple du contenu XML :

Exemple

import xml.etree.ElementTree as ET

# Définir une chaîne XML
xml_string = '''
<bookstore>
    <book>
        <title>Introduction to Python</title>
        <author>John Doe</author>
        <price>29.99</price>
    </book>
    <book>
        <title>Data Science with Python</title>
        <author>Jane Smith</author>
        <price>39.95</price>
    </book>
</bookstore>
'''


# Utiliser ElementTree pour analyser la chaîne XML
root = ET.fromstring(xml_string)

# Parcourir l'arbre XML
for book in root.findall('book'):
    title = book.find('title').text
    author = book.find('author').text
    price = book.find('price').text
    print(f'Titre : {title}, Auteur : {author}, Prix : {price}')

La sortie après l'exécution du code ci-dessus est :

Title: Introduction to Python, Author: John Doe, Price: 29.99
Title: Data Science with Python, Author: Jane Smith, Price: 39.95

Ensuite, nous allons créer un document XML contenant des informations sur les livres, puis utiliser ce module pour l'analyser et le manipuler :

Exemple

import xml.etree.ElementTree as ET

# Créer un document XML
root = ET.Element('bookstore')

# Ajouter le premier livre
book1 = ET.SubElement(root, 'book')
title1 = ET.SubElement(book1, 'title')
title1.text = 'Introduction à Python'
author1 = ET.SubElement(book1, 'author')
author1.text = 'John Doe'
price1 = ET.SubElement(book1, 'price')
price1.text = '29.99'

# Ajouter le deuxième livre
book2 = ET.SubElement(root, 'book')
title2 = ET.SubElement(book2, 'title')
title2.text = 'Data Science with Python'
author2 = ET.SubElement(book2, 'author')
author2.text = 'Jane Smith'
price2 = ET.SubElement(book2, 'price')
price2.text = '39.95'

# Enregistrer le document XML dans un fichier
tree = ET.ElementTree(root)
tree.write('books.xml')

# Analyser le document XML à partir du fichier
parsed_tree = ET.parse('books.xml')
parsed_root = parsed_tree.getroot()

# Parcourir l'arbre XML et afficher les informations du livre
for book in parsed_root.findall('book'):
    title = book.find('title').text
    author = book.find('author').text
    price = book.find('price').text
    print(f'Titre : {title}, Auteur : {author}, Prix : {price}')

Dans l'exemple ci-dessus, nous créons d'abord un document XML contenant des informations sur deux livres. Ensuite, nous enregistrons ce document dans le fichier books.xml. Puis, nous utilisons la méthode ET.parse() pour analyser le document XML dans le fichier, parcourir l'arbre du document et extraire et afficher le titre, l'auteur et le prix de chaque livre.


Python utilise SAX pour analyser XML

SAX est une API événementielle.

L'utilisation de SAX pour analyser des documents XML 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, quant à lui, est chargé de répondre aux événements et de traiter les données XML transmises.

  • 1. Traitement de fichiers volumineux ;
  • 2. N'avoir besoin que d'une partie du contenu du fichier, ou seulement besoin d'obtenir des informations spécifiques à partir du fichier.
  • 3. Lorsque vous souhaitez construire votre propre modèle objet.

Pour traiter du XML avec l'approche SAX en Python, vous devez d'abord importer la fonction parse depuis xml.sax, ainsi que ContentHandler depuis xml.sax.handler.

Introduction aux méthodes de la classe ContentHandler

méthode characters(content)

Lorsqu'il est appelé :

Depuis le début d'une ligne, avant qu'une balise ne soit rencontrée, s'il existe des caractères, la valeur de content est ces chaînes.

D'une balise jusqu'avant que la balise suivante ne soit rencontrée, s'il existe des caractères, la valeur de content est ces chaînes.

D'une balise jusqu'avant que le terminateur de ligne ne soit rencontré, s'il existe des caractères, la valeur de content est ces chaînes.

Les balises peuvent être des balises de début ou des balises 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é lorsqu'une balise ouvrante 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, une liste d'analyseurs

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 la chaîne XML :

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

Paramètres :

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

Exemples d'analyse XML en Python

Exemple

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

   # Appelé lorsqu'un élément commence
   def startElement(self, tag, attributes):
      self.CurrentData = tag
      if tag == "movie":
         print ("*****Movie*****")
         title = attributes["title"]
         print ("Title:", title)

   # Appelé lorsqu'un élément se termine
   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 = ""

   # Appelé lorsque des caractères sont lus
   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 de l'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 consulter la documentation complète de l'API SAX.API SAX Python


Analyse XML avec xml.dom

Le Document Object Model (DOM) est une interface de programmation standard recommandée par l'organisme W3C pour le traitement des langages de balisage extensibles.

Un analyseur DOM, lorsqu'il analyse un document XML, lit le document entier en une seule fois, enregistre tous les éléments du document dans une structure arborescente en mémoire. Vous pouvez ensuite utiliser les différentes fonctions fournies par DOM pour lire ou modifier le contenu et la structure du document, et également écrire le contenu modifié dans un fichier XML.

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

Exemple

#!/usr/bin/python3

from xml.dom.minidom import parse
import xml.dom.minidom

# Ouvrir le document XML à l'aide de l'analyseur minidom
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
   print ("Élément racine : %s" % collection.getAttribute("shelf"))

# Récupérer tous les films de la collection
movies = collection.getElementsByTagName("movie")

# Afficher les informations détaillées pour chaque film
for movie in movies:
   print ("*****Movie*****")
   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 ("Note: %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 DOM.API DOM Python。

Autres extensions