Python modifier un fichier xml

Python pour manipuler des fichiers xml dispose du module indispensable qui vous permet de faire ce que vous voulez.Voici le dernier article concernant la manipulation d’un fichier xml (enfin pour l’instant).

Petit rappel, nous avons vu :

Nous allons modfier un fichier xml existant en modifiant plusieurs choses :

  • la modification d’un attribut
  • le contenu d’un élément
  • la suppression d’un élément
  • l’ajout d’un élément

Pour suivre cet article, je vous invite à suivre le lien sur la création d’un fichier xml, pour rappel, voici ce que contient annuaire.xml :

<?xml version="1.0" encoding="UTF_8"?>
<annuaire>
  <personne id="0">
    <nom>Durant</nom>
    <prenom>Pierre</prenom>
    <telephone type="mobile">118.218</telephone>
  </personne>
  <personne id="1">
    <nom>Martin</nom>
    <prenom>Ingride</prenom>
    <telephone type="fixe">18</telephone>
  </personne>
</annuaire>

Modification d’un fichier XML en Python

Comme pour les deux autres articles, lisez-bien les commentaires, ils vous permettront de bien identifier et comprendre le rôle des fonctions.

Dans un fichier nommer modifier_xml.py qui se situe dans le même dossier que annuaire.xml, saisir :

#-*- coding: utf-8 -*-
#Choix de l'encodage utilisé pour le fichier python

#Importation du module
from lxml import etree

#Récupération du fichier xml qui se situe dans la dossier
annuaire = etree.parse('annuaire.xml')

#Ici, on imprime simplement le contenu de notre variable annuaire
print etree.tostring(annuaire)

#Je parcours la variable annuaire et je m'arrête sur chaque balise "personne"
for personne in annuaire.findall('personne'):
        #Je recherche le nom de la personne
        nom = personne.find('nom').text
        if nom == 'Durant':
                #Je crée un nouvel élément telephone
                telephone = etree.SubElement(personne,'telephone')
                #Je mets l'attribut de telephone
                telephone.set('type','fixe')
                #J'écris le numéro de téléphone
                telephone.text = '0178392893'
                #je recherche et parcours les éléments téléphone
                for mobile in personne.findall('telephone'):
                        #Je récupère le type de l'élément téléphone
                        type = mobile.get('type')
                        #si il s'agit d'un mobile, je change le numéro
                        if type == 'mobile':
                                mobile.text = '0633449933'
        #pour la personne s'appelant Martin
        if nom == 'Martin':
                #Je sélectionne les chanmps téléphone
                for mobile in personne.findall('telephone'):
                        type = mobile.get('type')
                        #Si le type est "fixe", je le change en "mobile"
                        if type == "fixe":
                                mobile.set('type','mobile')

#J'affiche à nouveau pour voir les changements
print etree.tostring(annuaire)

#J'ouvre ou crée un nouveau fichier et y écris mon nouvel annuaire, on pourrait réutiliser le fichier de base
try:
        #On ouvre (ou crée) le fichier xml pour travailler avec
        with open('annuaire_modif.xml','w') as fichier:
                #En-tête du fichier xml
                fichier.write('<?xml version="1.0" encoding="UTF_8"?>\n')
                #On écrit tous les éléments précédemment déclarer
                fichier.write(etree.tostring(annuaire,pretty_print=True).decode('utf-8'))
except IOError:
        print('Problème rencontré lors de l\'écriture ...')
        exit(1)

Voilà dans cet exemple, je ne supprime pas d’élément.

Suppression d’un élément dans un fichier XML en Python

Je vais le faire maintenant, dans un fichier suppression_ml.py, saisir :

#-*- coding: utf-8 -*-
#Choix de l'encodage utilisé pour le fichier python

#Importation du module
from lxml import etree

#Récupération du fichier xml qui se situe dans la dossier
annuaire = etree.parse('annuaire_modif.xml')

#Ici, on imprime simplement le contenu de notre variable annuaire
print etree.tostring(annuaire)

#Je parcours la variable annuaire et je m'arrête sur chaque balise "personne"
for personne in annuaire.findall('personne'):
        #Je recherche le nom de la personne
        nom = personne.find('nom').text
        if nom == 'Durant':
                #Syntaxe pour supprimer un noeud, ici il s'agit de "personne" qui contient le nom de Durant
                personne.getparent().remove(personne)
#J'affiche à nouveau pour voir les changements
print etree.tostring(annuaire)

#J'ouvre ou crée un nouveau fichier et y écris mon nouvel annuaire, on pourrait réutiliser le fichier de base
try:
        #On ouvre (ou crée) le fichier xml pour travailler avec
        with open('annuaire_modif_1.xml','w') as fichier:
                #En-tête du fichier xml
                fichier.write('<?xml version="1.0" encoding="UTF_8"?>\n')
                #On écrit tous les éléments précédemment déclarer
                fichier.write(etree.tostring(annuaire,pretty_print=True).decode('utf-8'))
except IOError:
        print('Problème rencontré lors de l\'écriture ...')
        exit(1)

Voilà, on n’a pas fait le tour de l’ensemble des possibilités de lxml mais vous devez avoir un minimum d’informations pour faire des projets vraiment amibitieux.

N’hésitez pas à partager et commenter.

Laisser un commentaire