Accueil
 chercher             Plan du site             Info (English version) 
L'histoire de XML s'écrit en ce moment même. XMLfr vous aide à la suivre et à en dégager les tendances.Les listes de discussions XMLfr sont à votre disposition pour réagir sur nos articles ou simplement poser une question.Si vous ètes passionnée(e) par XML, pourquoi ne pas en faire votre métier ?XMLfr n'est heureusement pas le seul site où l'on parle de XML. Découvrez les autres grâce à XMLfr et à l'ODP.Les partenaires grâce auxquels XMLfr peut se développer.Pour tout savoir sur XMLfr.XMLfr sans fil, c'est possible !Pour ceux qui veulent vraiment en savoir plus sur XML.L'index du site.
 Si vous vous posez une question, vous n'êtes peut-être pas le premier...Les traductions en français des bibles XML.Ces articles sont des références dans leur domaine.Tout ce qu'il faut savoir pour démarrer sur un sujet XML...


Perl et XML

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.


 

Mots clés.



L'histoire de XML s'écrit en ce moment même. XMLfr vous aide à la suivre et à en dégager les tendances.


Les documents publiés sur ce site le sont sous licence "Open Content"
Conception graphique
  l.henriot  

Conception, réalisation et hébergement
Questions ou commentaires
  redacteurs@xmlfr.org