> Modules standards > Autres modules > Parsing DOM avec ElementTree
Parsing DOM avec ElementTree
Utilisation : from xml.etree import ElementTree
Classes :
- la classe principale est Element (ElementTree.Element) qui représente un élément et tous ses sous-éléments (donc l'arboresence).
- la classe ElementTree (ElementTree.ElementTree) est simplement un wrapper autour de la classe Element qui est la classe qui représente vraiment l'arborescence xml. ElementTree fournit simplement en plus des fonctionnalités de sérialisation et désérialisation.
- attention : ne pas confondre le package ElementTree et la classe ElementTree de ce package.
tree = ElementTree.parse(myFile) : renvoie un objet de type ElementTree
myElement = ElementTree.fromstring('<myRoot> ...</myRoot>') : renvoie un objet de type Element qui est la racine du DOM
Pour imprimer le xml correspondant à un Element : ElementTree.tostring(myElement), ou ElementTree.tostring(myElement, 'utf-8') (si on a un ElementTree, faire : ElementTree.tostring(tree.getroot())
Si on veut faire une impression lisible par un humain, avec une indentation, utiliser plutôt pour cela le package minidom. Si on a un Element de ElementTree, faire alors :
import xml.dom.minidom
myXml = xml.dom.minidom.parseString(ElementTree.tostring(myElement))
print(myXml.toprettyxml(indent = ' '))
root = myTree.getroot() : renvoie la racine d'un objet de type ElementTree qui est de type Element
Propriétés d'un Element :
- myElement.tag : le tag de l'élément (dans le cas où il y a un namespace, ça sort {URI}tagName avec URI l'URI complète !)
- myElement.attrib : le dictionnaire des attributs.
- myElement.get('myAttr') : renvoie la valeur associée à l'attribut myAttr de cet élément (si cet attribut n'existe pas, renvoie None).
- myElement.get('myAttr', defaultValue) : si l'attribut n'existe pas, renvoie defaultValue plutôt que None.
- myElement.set('myAttr', myValue) : pour mettre une valeur à un attribut.
- myElement.text : le contenu de l'élément quand c'est du texte (CDATA) sinon renvoie None si pas de contenu.
Quand on veut avoir la valeur d'un attribut qui a un namespace :
- on a un dictionnaire global avec tous les namespaces : NAMESPACES = {'gating': 'http://www.isac-net.org/std/Gating-ML/v2.0/gating', ...}
- et pour l'attribut gating:id, on fait : myElt.get('{' + NAMESPACES['gating'] + '}id')
myElement.getchildren() : permet d'avoir les enfants
Iteration sur tous les sous éléments d'un élément donné :
for child in myElement:
print(child.tag, child.attrib)
Itération sur tous les éléments qui ont un tag donné, même si ce ne sont pas des enfants directs :
for elt in myElement.iter('myTag'):
print(elt.tag, elt.attrib)
myElement.iter('myTag') : renvoie un itérateur (même si myTag n'est pas trouvé du tout)
elt.findall('myTag') : renvoie la liste des éléments myTag qui sont directement en-dessous de l'élément elt
elt.find('myTag') : renvoie le premier élément myTag qui est directement en-dessous de l'élément elt (ou None s'il n'existe pas)
Pour trouver un tag ayant un certain namespace : elt.find('{http://myUrlNameSpace}name') ou mieux : elt.find('myNameSpace:name', ns) où ns est le dictionnaire {'myNameSpace': 'http://myUrlNameSpace'}.
Avec iter, on ne peut pas donner le dictionnaire, il faut utiliser l'url : elt.iter('{' + ns['myNameSpace'] + '}:name')
Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert