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