Cet article fait le point sur les modules XML utilisables en Perl.
Par Michel Rodriguez
vendredi 3 mars 2000
Cet article a été publié sur XML.com sous le titre "Processing XML with Perl".
Introduction
Perl est sans conteste (à part bien sûr de la part des fans de Python) le plus puissant, et
même les Pythonistes les plus fanatiques seront d'accord, le plus utilisé des langages de
manipulation de texte. Il est notamment extrêmement populaire dans le monde web. Une série de
modules XML a donc été développée, permettant d'utiliser toute la puissance du langage, et
notamment de ses expressions régulières pour manipuler des documents/données XML.
Je vous propose donc une revue des principaux modules, qui vont d'une implémentation du
DOM à une interface avec DBI (le module qui permet a Perl d'accéder à des bases de données
relationnelles) en passant par des implémentations de XPath et de XSLT. Pour chaque
module je mentionnerai ses principales caractéristiques et dans la mesure ou je l'ai utilisé, quelques
exemples.
XML::Parser
XML::Parser est l'ancêtre et la base de tous les modules Perl qui lisent XML. Développé à
l'origine par Lary Wall, le créateur de Perl, il offre une interface vers Expat, le parser de James Clark.
Tous les modules qui acceptent XML en entrée sont basés sur XML::Parser, il est donc
important de connaître ses particularités, qui en général se retrouvent dans les modules dérivés.
XML::Parser... parse un (ou plusieurs) document XML. Etant basé sur Expat c'est un parser
non-validant, qui ne vérifie donc que si le document est bien-formé. Sur chacun des événements
rencontrés un handler peut être appelé, permettant le traitement du document.
XML::Parser offre un certain nombre de "styles", qui facilitent son utilisation, répondants
aux noms (relativement) explicite de Stream, Object ou Tree
Quelques particularités qui peuvent surprendre:
-
en cas d'erreur, au grand désespoir de l'utilisateur, le parser (et le
script qui l'appelle) meurt après avoir affiché un message d'erreur. La parade est en fait très
simple: appeler le parser dans un bloc eval qui permet de récupérer l'erreur est de continuer le
traitement (mais pas le parsing),
-
toutes les chaînes de caractères retournées par XML::Parser
sont encodées en UTF-8 (unicode). Ceci qui ne dérange pas trop les anglo-saxons, pour qui les
deux codes sont équivalents, mais par contre les caractères accentués français sont transcodés par
défaut. Il est possible de récupérer le texte original assez facilement (mais c'est plus difficile dans
les attributs).
Pour plus d'informations sur comment utiliser XML::Parser, voir XML
and scripting languages par Parand Tony Daruger.
Un exemple de script utilisant XML::Parser en mode Stream.
Sax
Sax définit une interface événementielle permettant la communication entre différents
modules XML. XML::DOM, XML::Grove, XML::Path, entre autres, offrent une interface SAX.
XML::Parser::PerlSAX est un module dont le parser génère des événements SAX.
XML::Parser::PerlSAX est distribué dans le bundle libxml, qui rassemble un ensemble de
modules XML, dont XML::Grove, XML::Twig etc...
Les modules de manipulation d'arbre
Ces modules permettent la manipulation de documents XML sous forme d'arbre, offrant
l'accès aux éléments, attributs, à la DTD etc...
XML::DOM
XML::DOM est une implémentation du standard DOM niveau 1, plus quelques extensions.
C'est un des modules XML les plus populaires
Un exemple de script utilisant XML::DOM.
XML::DOM est basé sur XML::Parser et offre une interface SAX. Il est distribué dans le
bundle libxml-enno.
XML::Simple
XML::Simple a été développé pour permettre le chargement de fichiers de configuration en
XML. En fait il peut être utilisé pour charger en mémoire, sous forme d'un arbre assez simple,
tout fichier XML (qui tient en mémoire bien sûr).
XML::Simple est basé sur XML::Parser
Il est cependant préférable de limiter XML::Simple au traitement de fichiers simples (pas
trop de niveaux d'imbrications d'éléments, pas d'attributs), au moins en sortie. Par exemple je n'ai
pas pu implémenter l'exemple habituel avec XML::Simple.
XML::Twig
XML::Twig permet de manipuler des documents XML sous forme d'arbre. Il permet de
charger des sous-arbres afin de diminuer la quantité de mémoire nécessaire.
<Pub>En tant qu'auteur de XML::Twig je vous le recommande bien sur chaudement! Si la
demande populaire se fait forte il est possible que j'implémente un sous-ensemble du DOM et une
interface SAX (ou SAX2) dans le futur.</pub>
Un exemple de script utilisant XML::Twig.
XML::Twig est basé sur XML::Parser. Il est distribué séparément et au sein du bundle
libxml.
XML::Grove
XML::Grove permet de manipuler des documents XML sous forme d'arbre. Il charge le
document en mémoire et offre une interface simple, plus typiquement perlesque que XML::DOM.
XML::Grove est basé sur XML::Parser::PerlSAX ou XML::Grove::Builder (basés sur
XML::Parser). Il offre une interface SAX. Il est distribué séparément et au sein du bundle libxml.
Les autres Standards W3C
D'autres modules couvrent la plupart des autres standards associés à XML: XPath,
XSLT
XSLT
XML::XSLT est encore à l'état de prototype et ne supporte qu'un sous-ensemble du
standard.
XML::XSLT est basé sur XML::DOM.
RSS
XML::RSS permet la manipulation de données RSS (RDF Site Summary) utilisées par
exemple par Slashdot et Freshmeat. Il offre également la conversion de ces données vers HTML.
XQL
XQL est couvert par 2 modules, XML::XQL et XML::miniXQL
XML::XQL est distribué dans le bundle libxml-enno, il offre des interfaces SAX et DOM
XML::XPath
XML::Path est basé sur XML::Parser et offre une interface SAX.
Autres Modules
La liste des autres modules est trop longue (et trop changeante) pour pouvoir être donnée
in-extenso, aussi je me contenterai ici de décrire les plus courants.
D'autres modules couvrent:
-
Edifact (XML::Edifact),
-
la conversion de variables CGI vers et depuis XML
(XML::CGI),
-
XCatalog, une proposition de catalogue permettant
l'association d'identifiants PUBLIC et SYSTEM (XML::Catalog),
-
la sauvegarde (et relecture) de données Perl complexes sous
forme de document XML (XML::Dumper),
-
la production de documents XML canoniques
(XML::Handler::CanonXMLWriter),
-
la manipulation de documents XML en mode stream:
XML::Node, XML::PactAct, XML::Stream,
-
des extensions XML au langage d'expressions régulières de
Perl: XML::RegExp
-
une interface vers le moteur de requête XML Go
(GoXML::XQI).
XML::Checker
XML::Checker offre un parser/validateur pour des documents XML ou des arbres
XML::DOM. En cas d'erreur il retourne une valeur d'erreur et appelle un handler définit par
l'utilisateur.
XML::Checker est encore au stade alpha, il offre une interface SAX (et DOM bien sûr). Il
est distribué dans le bundle libxml-enno.
DBIx::XML_RDB
DBIx::XML_RDB est un module qui exporte des données d'une DB relationnelle (le résultat
d'un select), sous forme de document XML. La distribution comprend un outil séparé qui assure
la même fonction et un wrapper Win32 Ole qui permet d'appeler ce module depuis n'importe
qu'elle application conforme à Ole.
XMLNews
XMLNews::HTMLTemplate et XMLNews::Meta permettent la manipulation et la
conversion vers HTML de documents XML suivant la DTD XMLNews (comme cet article).
Ces modules sont basés sur XML::Parser.
XML::Writer
XML::Writer offre un interface permettant de produire un document XML à-la CGI.pm,. Le
module vérifie que le document est bien-formé et se charge d'encoder les caractères spéciaux.
Conclusion
En conclusion le foisonnement de modules, même si leur nombre peut parfois effrayer (mais
après tout la devise de Perl est There is more than one way to do it -
TMTOWTDI), assure que chacun puisse trouver le plus approprié à son problème.
Ces modules sont supportés par la mailing liste Perl-XML, qui offre également, comme
toute bonne mailing liste, conseils, avis, réponse aux questions des utilisateurs de modules et
annonce de nouvelles versions.
Tous ces modules devraient également bénéficier du support natif d'Unicode par Perl version
5.6 (ou 5.006), permettant notamment d'utiliser toute la puissance des expressions régulières sur
l'UTF-8 retourné par XML::Parser.
Ressources
Liens
Mailing Liste
Pour s'inscrire sur la mailing liste Perl-XML vous pouvez utiliser l'interface web
ou envoyer un email à Lyris@ActiveState.com comportant le texte SUBSCRIBE Perl-XML (ou
SET Perl-XML DIGEST pour recevoir uniquement le digest). Les archives sont disponibles sur le
site d'Activestate à la même adresse, http://www.activestate.com/support/mailing_lists.html#XML.
|