Bon, je voulais vous faire une petite intro a lxml.etree ou comment jouer avec du xml gentilment
j'aime me plaire a dire que l'xml est une putain de grosse bouse des prés, mais ca a quelques avantages :
soit pour moi l'xml c'est simplement un arbre, avec un element 1er la “root” et plein de sous element
(ici c'est la root) . |-- element 1 |-- element 2 |-- element 3 | |-- sous element 1 de l'element 2 | |-- sous element 2 de l'element 2 | |-- sous element 3 de l'element 2
et ainsi dessuite (merci a tree(1))
c'est la partie que j'aime le plus dans l'xml
on peut soit balancer une string :
import lxml.etree as ET root = ET.fromstring("<root><element1>txt</element1><element2 /><element3><souselement1>gcuisgoodforyou</souselement1></element3></root>")
à partir de la, vous avez tout un arbre d'objet de type 'Element' :
In [3]: root Out[3]: <Element root at 8465414>
Ok on a notre arbre, mais bon .. si seulement on pouvait chercher la-dedans ce serait beacoup mieux. et la vous vous dites “ouais trop la mort”. ben moi, mon truc c'est xpath and co :
In [5]: elem = root.find('.//souselement1') In [6]: elem Out[6]: <Element souselement1 at 84653ec> In [8]: elem.text Out[8]: 'gcuisgoodforyou'
Wai wai c'est quand meme pas mal. Apres on peut recuperer un iterator sur les elements qui ont un meme nom :
for elem in root.findall('.//elemquilyabeaucou') print elem.text
ah oui un dernier petit truc, c'est les namespaces et parfois c'est galew galew :
root = ET.fromstring("""<root xmlns:gcu="http://www.jesaispasquoi/ns/gcu"><gcu:element1>txt</gcu:element1><gcu:element2 /><gcu:element3><gcu:souselement1>gcuisgoodforyou</gcu:souselement1></gcu:element3></root>""") namespace = 'http://www.jesaispasquoi/ns/gcu' elem = root.find('.//{%s}souselement1' % namespace)
et wala le parsing c'est tranquille !
Bon, on repart toujours pareil de notre root :
root = Element('root')
puis a cette root on lui file des sous elements et la deux solutions :
for elem in range(0, 3): SubElement(root, "element%d" % elem)
for elem in range(0, 3): root.append(Element("element%d" % elem))
apres on peut rajouter toute sorte de truc relou a propre a l'xml :
newelem = Element('MonElementJavaStyleTipTop', {'attr1' : 'caycool'}, nsmap=nsmap) newelem.text = "ouais trop la fayte" In [14]: newelem Out[14]: <Element MonElementJavaStyleTipTop at 84654dc> In [15]: print ET.tostring(newelem) <MonElementJavaStyleTipTop xmlns:gcu="http://www.gcu.info/squad/namespace/gcu" attr1="caycool">ouais trop la fayte</MonElementJavaStyleTipTop>
et voila on a créé un element plus complet, avec des namespace et tout et tout.
Bref, voila un peu les bases pour parser / generer de l'xml gentilment sans trop se prendre la tete.
mister D for gcu canal historique avec des vrais dinosaures dedans.