Salut,
Pour aller dans le sens de PauseKawa, vous récupérez des "documents XML" sous forme sérialisée (une suite de caractères).
Pour traiter leur contenu, plutôt que de passer par des regexp appliquées sur la forme "sérialisée", vous utilisez Element Tree pour les transformer en "objet".
Cet "objet" est "composé": c'est un arbre (il a une racine) contenant des objets de type Element. Comme c'est un arbre on peut le "traverser" en parcourant l'ensemble de ses "noeuds".
Un Element XML c'est un "tag", des "attributes", du "text", des "children" et un "tail" +/- optionnels.
Exemple:
1 2 3 4 5 6
| TEXT = """<?xml version='1.0' encoding='UTF-8'?><root><a><b>a1</b></a><a><b>a2</b></a></root>"""
import xml.etree.cElementTree as et
root = et.XML(TEXT)
for e in root.iter():
print 'tag:"%s", text="%s"' % (e.tag, e.text) |
Produit:
1 2 3 4 5
| tag:"root", text="None"
tag:"a", text="None"
tag:"b", text="a1"
tag:"a", text="None"
tag:"b", text="a2" |
Vous avez aussi des fonction de filtrage avancé dites Xpath qui permettent de filtrer les noeuds que vous voulez "sortir":
1 2
| for e in root.findall("a/b"):
print 'tag:"%s", text="%s"' % (e.tag, e.text) |
ne sortira que les elements:
1 2
| tag:"b", text="a1"
tag:"b", text="a2" |
J'ai profité de l'occasion pour revoir un peu ElementTree: un de ses avantages est d'être inclus dans Python. Mais son gros inconvénient dans le cas particulier et de ne pas inclure la partie "validation" du document contre un XSD ou un DTD: j'ai pas trouvé et c'est pour cela que je préfère lxml.
En effet, je ne vois pas trop l'intérêt de structurer les échanges dans un format aussi bavard si on n'en profite pas pour s'assurer que le message est bien construit, que les données sont dans le format attendu,...
Autant échanger des tuple (format .CSV) ou du JSON: c'est moins compliqué à mettre en oeuvre et moins couteux en temps de traitement.
- W
Partager