Bon, je voulais vous faire une petite intro a lxml.etree ou comment jouer avec du xml gentilment

l'xml

j'aime me plaire a dire que l'xml est une putain de grosse bouse des prés, mais ca a quelques avantages :

  1. ca fait plaisir aux flans
  2. ca structure les donnees (ca c'est le meilleur argument d'un pote ..)
  3. en vrai on peut verifier son integrité avec les XMLSchema (et la y'a deux methodes mais je sais plus trop et la duvel me fait de l'oeil)

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))

le parsing

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 !

écrire de l'xml pouet

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 :

  • soit on utilise SubElement :
    for elem in range(0, 3):
        SubElement(root, "element%d" % elem)
  • soit ajouter un Element a un Element :
    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.

todelete/xml_tranquile.txt · Last modified: 2010/01/12 13:29 (external edit)
www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0