vendredi 27 novembre 2009

lxml: Python et Xml

L'un des meilleurs package XML disponible pour Python est lxml (aussi connu comme ElementTree).
Ce package n'est pas disponible par défaut lors de l'installation de Python, il convient donc de faire le nécessaire (voir détails plus loin).

Tutorial
ElementTree dispose d'un excellent tutorial de prise en main qu'il ne faut surtout pas rater sur "code speak".
Code Speak publie également une documentation pdf complète.
L'article "ElementTree Overview" propose un court survol de eTree mais incluant néanmoins le parsing, chargement et sauvegarde.
Voir également "Python XML processing with lxml"

Exemple
Cette exemple montre la création et la sauvegarde d'un document XML.
Plus d'exemples sont disponibles dans l'excellent tutorial dédié a lxml.etree sur "Code Speak".
>>> from lxml import etree
>>> _rootNode = etree.Element( 'root-node' )
>>> etree.SubElement( _rootNode, 'first-child' )
<Element first-child at 124b3c0>
>>> etree.SubElement( _rootNode, 'second-child' )
<Element second-child at 1241e10>

>>> _attr = _rootNode.attrib
>>> _attr['UnAttribut']='UneValeur'
>>> print( etree.tostring( _rootNode, pretty_print=True ) )
<root-node UnAttribut="UneValeur">
  <first-child/>
  <second-child/>
</root-node>

>>> # sauvegarde dans un fichier
>>> _tree = etree.ElementTree( _rootNode )
>>> _f = open( 'test.xml', 'w' )
>>> with _f:
 _tree.write( _f )

 
>>> # autre sauvegarde
>>> _tree.write( 'test2.xml' )

Installation de lxml
ElementTree fait partie du package lxml qui peut être installé depuis Python Package Index (PyPI) à l'aide de easy_install (voir cet article) .
Le package lxml se base sur libXml et libXslt qui ne sont habituellement pas installés dans l'environment Windows (voir la note "installing lxml" sur "code speak" pour quelques infos complémentaires).
En temps normal, les package PyPI contiennent les dépendances binaires (DLL) nécessaires et ces dernieres sont automatiquement installées par easy_install.
Il arrive cependant que les dépendances binaires ne soient pas encore disponibles dans la dernière version d'un package (ce qui peut être le cas pour des packages en cours de développement).
Dans ce cas, easy install retourne inévitablement le message d'erreur "** make sure the development packages of libxml2 and libxslt are installed **".
Dans ce cas, il convient d'identifier dans PyPI la dernière version stable du package et de passer ce numéro de version en paramètre à easy_install.
Ce fut le cas lors de ma tentative d'installation lxml à l'aide de easy_install ("best match" pour la version 2.2.3).
Le commande d'installation correcte était finallement:
easy_install lxml==2.2.2

Informations relatives au port de LibXml sous Windows
Zlatkovic dispose d'un site spécifique concernant le portage de LibXml sous Windows.
Ce site propose également un lien ftp (ftp.zlatkovic.com/libxml/) permettant de télécharger les DLLs libXml et consort (à installer manuellement dans le répertoire c:\windows\).
Comme le précise Zlatkovoc sur son site, il existe un certains nombre de dépendance entre libXml et d'autres librairies comme zlib et vicon (voir image ci-dessous).
image: www.zlatkovic.com/images/libxml-pkgdeps.png
A noter finalement qu'en installant LibXml, LibXslt, IconV and ZLib quelques utilitaires sont également installés et disponible en ligne de commande (xsltproc,  xmlcatalog, xmllint, minigzip).

Aucun commentaire: