Mis a jour le 2018-10-21, 16:55

Parsing DOM avec ElementTree

Utilisation : from xml.etree import ElementTree
Classes :
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 :
Quand on veut avoir la valeur d'un attribut qui a un namespace :
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