Lire (et modifier) un fichier XML avec Python

Un article précédent a montré comment générer facilement un corpus textuel avec Python. Le corpus ainsi produit se présentait sous forme d’un fichier au format XML, écrit notamment grâce à xml.etree.ElementTree, qui fait partie de la librairie standard.

ElementTree s’avère donc utile pour créer des fichiers XML, mais permet aussi de lire des fichiers préexistants, notamment dans le but de les modifier.

Voici comment procéder pour lire l’arborescence d’un fichier XML et lui apporter des modifications.

Vous pouvez retrouver le code présenté ici sous forme de snippet Gitlab. Le fichier utilisé est le fichier de sortie du script présenté dans cet article. Il est mis à disposition sur Gitlab et sur Github.

Dans l’article consacré à la constitution automatique d’un corpus web en XML, l’une des améliorations suggérées était de mettre en place un identifiant plus explicite qu’un simple identifiant chiffré. Je vais maintenant expliquer comment mettre ce changement en place sur un corpus déjà constitué, enregistré dans un fichier XML.

Le corpus pris en exemple est décrit ici, ce qui est à modifier est donc l’attribut id de chaque élément Page. Les étapes de traitement sont les suivantes :

  1. Parser l’arborescence XML du fichier d’entrée.
  2. Parcourir chaque élément Page pour en modifier l’attribut id.
  3. Enregistrer la nouvelle arborescence dans un fichier.

Le parsing se fait de façon très simple puisqu’une fonction dédiée, parse(), est prévue dans ElementTree1. Elle prend en argument le contenu du fichier, ouvert via with open().

with open("web_corpus.xml", encoding="utf-8") as corpus:
    tree = ET.parse(corpus)

La variable tree correspond maintenant à l’arborescence XML parsée par ElementTree2, mais l’objet correspondant n’est pas itérable. Pour pouvoir mettre en place une boucle et naviguer dans l’arborescence, il faut d’abord récupérer sa racine avec .getroot().

Rechercher un ou plusieurs éléments de l’arborescence se fait respectivement avec .find() (renvoie le premier élément correspondant) et .findall() (renvoie tous les éléments correspondants). La racine ayant été associée à la variable root, pour parcourir les éléments Page du corpus il faudra utiliser une boucle for sur root.findall("Page")3.

Voici à quoi ressemble le script pour le moment :

with open("web_corpus.xml", encoding="utf-8") as corpus:
    tree = ET.parse(corpus)
    root = tree.getroot()
    for page in root.findall("Page"):
        # modifier l'attribut 'id'

La valeur du ou des attributs associés à l’élément Page courant (désigné par la variable page) s’obtient avec page.attrib. Si on remplace la ligne commentée du script ci-dessus par print(page.attrib), la console affichera ceci :

{'id': '1'}
{'id': '2'}
{'id': '3'}
{'id': '4'}

Le fichier XML du corpus comporte effectivement 4 éléments Page portant les attributs 1 à 4. On peut ici voir que la valeur des attributs d’un élément est récupérée sous forme de dictionnaire. Elle va alors pouvoir être lue et modifiée en tant que telle. Dans le cas présent, pour modifier l’attribut id de la page courante, il faut attribuer une nouvelle valeur à page.attrib['id'].

with open("web_corpus.xml", encoding="utf-8") as corpus:
    tree = ET.parse(corpus)
    root = tree.getroot()
    for page in root.findall("Page"):
        current_id = page.attrib['id']
        new_id = f"wikipedia_yosakoi-{current_id}"
        page.attrib['id'] = new_id

L’arborescence XML contenue dans la variable root correspondant à sa racine a été mise à jour. Il ne faut toutefois pas en rester là, parce qu’en l’état ces modifications n’ont été répercutées dans aucun fichier de sortie. L’écriture du fichier de sortie, qu’il s’agisse d’un nouveau document XML ou de l’écrasement du fichier d’entrée, se fait comme expliqué précédemment4.

Voici les premières lignes du nouveau fichier XML, avec changement de valeur pour id :

En reprenant les principes de ce traitement (script complet disponible ici), il est ainsi possible de modifier la valeur d’à peu près n’importe quel constituant de la structure XML : les attributs avec .attrib comme montré ici, mais aussi le contenu textuel avec .text ou encore les balises avec .tag, par exemple.

Citer ce billet : “Lire (et modifier) un fichier XML avec Python”, par Alexander Delaporte. Publié sur Tekipaki le 20/07/2021. Lien : https://tekipaki.hypotheses.org/1906.
  1. Voir la documentation. []
  2. Soit une instance d’objet de la classe xml.etree.ElementTree.ElementTree. []
  3. Attention à la casse pour le nom des éléments, elle doit être respectée pour que .findall() fonctionne. []
  4. Voir également cet article pour plus de détails concernant la déclaration XML. []

Auteur/autrice : Alexander Delaporte

Ingénieur d'études au Centre de recherches linguistiques sur l'Asie Orientale et chercheur associé BnF 2019-2021

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.