Format XML
Rappel : Format reconnu pour l'échange de données entre applications
Un fichier XML (Extensible Markup Language) est un fichier texte (!) permettant de décrire des documents.
Le principe de construction est simple et immuable (organisation hiérarchique, balises, attributs), mais la structure est évolutive (extensible) en fonction du document à décrire.
<liste>
<personne>
<Prenom>Robert</Prenom>
<Nom>Lepingre</Nom>
<Email>bobby@exemple.com</Email>
<Age>41</Age>
<Ville>Paris</Ville>
</personne>
<personne>
<Prenom>Jeanne</Prenom>
<Nom>Ducoux</Nom>
<Email>jeanne@exemple.com</Email>
<Age>32</Age>
<Ville>Marseille</Ville>
</personne>
<personne>
<Prenom>Pierre</Prenom>
<Nom>Lenfant</Nom>
<Email>pierre@exemple.com</Email>
<Age>23</Age>
<Ville>Rennes</Ville>
</personne>
</liste>
Méthode : 1. Sauvegarder un objet de type Personne dans un fichier
Le module « xml » permet de gérer les fichiers au format XML sous Python
#import module Perso
import ModulePersonne as MP
#import module xml
import xml.etree.ElementTree as ET
#saisie personne
p = MP.Personne()
p.saisie()
#ecriture racine
root = ET.Element("personne")
#ecriture des elements
item_prenom = ET.SubElement(root,"Prenom")
item_prenom.text = p.prenom
item_nom = ET.SubElement(root,"Nom")
item_nom.text = p.nom
item_email = ET.SubElement(root,"Email")
item_email.text = p.email
item_age = ET.SubElement(root,"Age")
item_age.text = str(p.age)
item_ville = ET.SubElement(root,"Ville")
item_ville.text = p.ville
#sauvegarde fichier
tree = ET.ElementTree(root)
tree.write("personne.xml")
- root est le nœud racine de la structure ;
- Noter la nature hiérarchique de la structure ;
- Il peut y avoir des nœuds intermédiaires. (cf. la sauvegarde des listes d'objets) ;
- Nous typons toutes les informations en chaîne de caractères cf. str() ;
- personne, Prenom, Nom, EMail, Age, Ville sont des balises XML.
Simulation : À faire vous-même
1) Si ce n'est déjà fait, téléchargez le fichier Python ci-dessous et stockez le dans le même répertoire que votre futur programme Python nécessaire à la question 2).
2) Utilisez la méthode précédente pour obtenir le premier enregistrement du tableau de données au format XML.
<personne><Prenom>Robert</Prenom><Nom>Lepingre</Nom><Email>bobby@exemple.com</Email><Age>41</Age><Ville>Paris</Ville></personne>
Complément : Lecture du fichier - Charger un fichier XML
#import module Perso
import ModulePersonne as MP
#import module xml
import xml.etree.ElementTree as ET
#ouverture
tree = ET.parse("personne.xml")
#recuperer la racine
root = tree.getroot()
#trans. en Personne
p = MP.Personne()
p.prenom = root.findtext("Prenom")
p.nom = root.findtext("Nom")
p.email = root.findtext("Email")
p.age = int(root.findtext("Age"))
p.ville= root.findtext("Ville")
#affichage
p.affichage()
Remarque : Variante avec les attributs
#import module Perso
import ModulePersonne as MP
#import module xml
import xml.etree.ElementTree as ET
#saisie personne
p = MP.Personne()
p.saisie()
#ecriture racine
root = ET.Element("personne")
#associer un attribut a la balise personne
root.set("Prenom",p.prenom)
item_nom = ET.SubElement(root,"Nom")
item_nom.text = p.nom
item_email = ET.SubElement(root,"Email")
item_email.text = p.email
item_age = ET.SubElement(root,"Age")
item_age.text = str(p.age)
item_ville = ET.SubElement(root,"Ville")
item_ville.text = p.ville
#sauvegarde fichier
tree = ET.ElementTree(root)
tree.write("personne_attribut.xml")
#import module Perso
import ModulePersonne as MP
#import module xml
import xml.etree.ElementTree as ET
#ouverture
tree = ET.parse("personne_attribut.xml")
#ouverture
tree = ET.parse("personne.xml")
#recuperer la racine
root = tree.getroot()
#trans. en Personne
p = MP.Personne()
p.prenom = root.get("Prenom") #attribut a la racine
p.nom = root.findtext("Nom")
p.email = root.findtext("Email")
p.age = int(root.findtext("Age"))
p.ville= root.findtext("Ville")
#affichage
p.affichage()
Méthode : 2. Sauvegarder une collection (liste) de personnes
Objectif : Sauvegarder un ensemble de personnes dans un fichier XML.
#import module Perso
import ModulePersonne as MP
#import module xml
import xml.etree.ElementTree as ET
#liste vide
liste = []
#nb. de pers ?
n = int(input("Nb de pers : "))
#saisie liste
for i in range(0,n):
a = MP.Personne()
a.saisie()
liste.append(a)
#racine
root = ET.Element("liste")
#pour chaque personne
for p in liste:
#personne xml
px = ET.SubElement(root,"personne")
#champs
item_prenom = ET.SubElement(px,"Prenom")
item_prenom.text = p.prenom
item_nom = ET.SubElement(px,"Nom")
item_nom.text = p.nom
item_email = ET.SubElement(px,"Email")
item_email.text = p.email
item_age = ET.SubElement(px,"Age")
item_age.text = str(p.age)
item_ville = ET.SubElement(px,"Ville")
item_ville.text = p.ville
#sauvegarde
tree = ET.ElementTree(root)
tree.write("personnes.xml")
- Il y a deux niveaux dans la structure ;
- \(px\) ("personne") est un sous-élément de root ("liste") ;
- C'est bien sur \(px\) que l'on insère les informations sur chaque personne.
Simulation : À faire vous-même
Utilisez la méthode précédente pour obtenir l'enregistrement complet du tableau de données au format XML.
<liste><personne><Prenom>Robert</Prenom><Nom>Lepingre</Nom><Email>bobby@exemple.com</Email><Age>41</Age><Ville>Paris</Ville></personne><personne><Prenom>Jeanne</Prenom><Nom>Ducoux</Nom><Email>jeanne@exemple.com</Email><Age>32</Age><Ville>Marseille</Ville></personne><personne><Prenom>Pierre</Prenom><Nom>Lenfant</Nom><Email>pierre@exemple.com</Email><Age>23</Age><Ville>Rennes</Ville></personne></liste>
Complément : Lecture du fichier - Charger une liste d'objets à partir d'un fichier XML
#import module Perso
import ModulePersonne as MP
#import module xml
import xml.etree.ElementTree as ET
#ouverture
tree = ET.parse("personnes.xml")
#recuperer la racine
root = tree.getroot()
#conv. en liste de personnes
liste = []
for child in root:
#creer une personne
p = MP.Personne()
p.prenom = child.findtext("Prenom")
p.nom = child.findtext("Nom")
p.email = child.findtext("Email")
p.age = int(child.findtext("Age"))
p.ville= child.findtext("Ville")
#affichage
p.affichage()
#l'ajouter dans la liste
liste.append(p)
print("Nb personnes : ",len(liste))