Powered by |
Développement XML en Java sous LinuxMichel CASABIANCA - casa@sweetohm.netCe document présente une brève introduction à XML, les outils Java de développement ainsi que des exemples de mise en oeuvre de XML.
Pour télécharger la dernière version de ce document :
Introduction à XMLOrigines
XML (eXtensible Markup Language) est né du constat que le HTML n'est pas adapté aux futures exigences de l'internet. Des ingénieurs ont alors eu l'idée de remplacer le HTML par SGML (Standard Generalized Markup Language), seul système capable à l'époque de succéder au HTML. Jon Bosak, qui travaillait pour Sun, a alors été chargé par le W3C de "mettre le SGML sur le web". Le travail de définition de ce qui allait devenir le XML (suggestion du gourou SGML James Clark) a duré onze semaines (de la fin août 1996 à novembre de la même année, date de publication du premier draft). Les finitions ont pris encore une année et la version 1.0 de la norme a été publiée en février 1998. L'idée du groupe de travail du W3C était de créer un langage de balisage hypertexte aussi simple à apprendre et utiliser que le HTML et aussi puissant que le SGML. C'est une démarche similaire qui a conduit Sun à développer Java (simplification du C++). Caractéristiques de XML
XML reprend donc les principales caractéristiques qui font la puissance de SGML :
Comparaison avec HTMLPour comprendre l'intérêt du XML, on peut le comparer au HTML qui a le mérite d'être connu de tous. Pour la démonstration, je prendrai l'exemple d'un répertoire d'adresses. Voici l'allure du fichier HTML :
Le moins que l'on puisse dire est que le source HTML n'est pas particulièrement clair ! Voici maintenant l'allure du fichier XML :
Ce source XML contient les mêmes informations, mais il présente les avantages suivants :
Document Type DefinitionsOn peut fixer la grammaire d'un type de document à l'aide d'une DTD (pour Document Type Definition). Celle de notre exemple de répertoire permet d'imposer que toute entrée comporte un nom et un prénom, une qualité, etc. Pour notre répertoire, cette DTD pourrait ressembler à la suivante:
Un document muni d'une DTD peut être validé ce qui certifie qu'il est conforme à son type. Les DTDs du standard sont cependant relativement pauvres (on ne peut par exemple pas imposer qu'un champ soit un nombre entier). Pour aller plus loin, on peut utiliser Schema qui propose des conditions beaucoup plus fines pour les types de document. Feuilles de style
Bien sûr, on peut se poser la question de savoir comment on peut visualiser un fichier XML dans la mesure où les balises ne donnent aucune indication sur la présentation du document. Pour pouvoir afficher un fichier XML, il faut donc lui associer une feuille de style. Celle-ci permet de le transformer en un document (HTML ou autre) que l'on peut afficher.
Figure 1: Transformation XSLT XSLT (eXtensible Style Language, Transformation) est un standard du W3C permettant de transformer un fichier XML en un autre fichier, XML ou d'un autre format (HTML, PDF ou Texte par exemple). Un fichier XSL est lui-même un fichier XML opérant une transformation sur l'arbre du document XML. Une feuille de style XSLT est essentiellement constituée de templates. Un template transforme un élément XML en un texte quelconque dans le document résultant (par exemple en un tag HTML). Pour transformer un nom de notre répertoire en un tag <h2>, nous pourrions définir le template suivant:
On aura compris que la modification de la présentation de la page n'implique que la modification de la feuille de style (et non de chaque fichier HTML, ce qui peut devenir un cauchemar pour de gros sites). XSLT va cependant plus loin que d'autres langages de feuille de style (comme CSS) car il permet de manipuler la structure du document. On peut ainsi générer automatiquement un index de notre répertoire et le trier par ordre alphabétique par nom ou entreprise par exemple. On peut aussi transformer un fichier XML de type A en un document de type B, passant ainsi d'une DTD à une autre (si les informations sont compatibles). XSLT est donc aussi un langage de transformation entre DTD. Échange de données textuelles entre programmesXML va beaucoup plus loin que HTML car son champ d'application ne se borne pas aux documents texte. Du fait que l'on peut y extraire des informations de façon fiable, il permet l'échange d'information entre programmes. Cette utilisation de XML a de beaux jours devant elle car un fichier XML présente de nombreux avantages sur un fichier binaire ou texte "plat":
Par exemple, XML-RPC permet d'appeler des méthodes sur une machine distante grâce à un protocole utilisant XML. Il présente, par rapport à RMI par exemple, l'avantage d'être indépendant du langage (alors que RMI est lié à Java) et de la plateforme. XML est très utilisé comme format de données textuelles, voir les exemples de mise en oeuvre à la fin de cet article pour des applications concrètes. Standards dérivés
Un intérêt de XML est donc l'échange d'informations. Pour que cet échange soit possible, il faut que les acteurs d'un secteur se mettent d'accord sur une DTD commune. On voit donc émerger quotidiennement de nouvelles spécifications pour toutes sortes de domaines d'activité (allant de la notation musicale au commerce électronique). Il a ainsi été définit un standard pour la notation de formules mathématiques : http://www.w3.org/TR/REC-MathML/. IBM propose un http://www.software.ibm.com/network/techexplorer/ pour visualiser des formules écrites dans ce format et Amaya permet de les visualiser depuis peu. Cependant, il risque d'apparaître un problème : celui de la multiplication des DTD concurrentes nuisant à toute standardisation (voir l'article http://www.xmltechno.com/focus/2000_08_28_standards/standards_xml_p1.cfm). On peut néanmoins espérer que l'on remédie à cette situation, pour plusieurs raisons :
C'est à mon sens le seul nuage assombrissant l'avenir de XML. APIsLe langage XML étant un standard, il permet l'échange d'informations entre applications. L'étape suivante est en toute logique la standardisation de l'API des parsers (composants logiciels permettant d'accéder facilement aux données contenues dans un document XML). C'est le but de SAX (Simple API for XML) et de DOM (Document Object Model). SAX
Le principe du parser SAX est simple : on lui raccorde des objets dont les méthodes (implantant des interfaces précises) sont appelées par le parser lorsque certains évènements se produisent au cours du parsing du fichier XML. La norme SAX (en version 2) définit ainsi quatre interfaces :
SAX est très rapide et peu gourmand en mémoire, mais il ne permet pas de manipuler l'arbre du document lors du parsing (il ne fait que consommer les données). La norme permet d'écrire des applications indépendantes du parser utilisé (en prenant quelques précautions décrites plus loin dans ce document). DOM
DOM (Document Object Model) permet de représenter un document XML sous forme d'un arbre d'objets en mémoire. Il définit une API pour parcourir et modifier l'arborescence. DOM est donc tout indiqué pour des applications modifiant l'arbre du document (comme un éditeur graphique de fichiers XML). Cependant, DOM soufre d'un certain nombre de défauts :
Java API for XML ParsingSun a mis au point l'API pour le parsing XML afin de résoudre les problèmes de dépendance du code au parser évoqués ci-dessus. Son API est une enveloppe pour rendre le code d'une application XML indépendante du parser utilisé. Elle encapsule la création et le paramétrage des parsers SAX et DOM. Par exemple, pour créer un parser SAX validant et implantant les espaces de nommage, on utilisera le code suivant :
Ce code est totalement indépendant du parser utilisé et fonctionnera avec tout parser conforme à l'API JAXP. JAXP définit aussi un mécanisme semblable pour instancier et paramétrer un parser DOM. Le parser de Sun et les principaux parsers XML en Java implantent cette API et il est très probable que tous les autres fournisseurs suivent cet exemple. Outils pour XMLJe vous propose maintenant de faire un tour d'horizon des principaux outils XML tournant sur plateforme Linux (pour l'essentiel des outils Java). Un tel référencement ne peut prétendre être exhaustif car le nombre d'outils disponible est très important et augmente sans cesse. Pour des listes exhaustives et régulièrement mises à jour, on pourra consulter la page http://www.stud.ifi.uio.no/~lmariusg/linker/XMLtools.html (concernant exclusivement les outils libres) ou encore le site http://www.xml.com/resourceguide qui recense aussi les outils propriétaires. D'autre part, l'article http://www.xmltechno.com/outils/01_intro_p1.cfm recense les principaux outils XML pour l'ensemble des langages de programmation et des plateformes. Le projet xml.apache.org
Le projet xml.apache.org a pour objectif de fournir des solutions XML de qualité en Open Source, de faire suivre les observations concernant les standards de l'IETF et du W3C et de regrouper les activités relatives à XML du projet Apache. Il regroupe de nombreuses entreprises actives dans le domaine (dont IBM, Lotus, Sun, Exoffice et Bowstreet) et gère les sous-projets suivants :
Ce projet est une avancée majeure vers l'acceptation large des logiciels Open Source. Il concrétise l'engagement de grandes sociétés informatiques sur la voie du logiciel libre. Le développement de ces outils est http://xml.apache.org/overview.html. Xml.apache.org met à disposition des utilisateurs et développeurs des http://xml.apache.org/mail.html. Parsers XMLUn parser est un composant logiciel (classes Java en l'occurrence) permettant d'accéder simplement aux données encapsulées dans un fichier XML. C'est donc le composant de base de toute application XML. SAX permet de produire du code standard qui s'adapte, sans recompilation, à tout parser moyennant quelques efforts. En particulier, on prendra soin de ne pas instancier directement le parser, mais de passer par la classe dédiée (XMLReaderFactory). D'autre part, il est utile de donner la possibilité de paramétrer le nom de la classe du parser (sur la ligne de commande ou dans un fichier de configuration). JAXP (Java API for XML Parsing), API définie par Sun pour les parsers XML en Java permet d'écrire du code indépendant du parser utilisé pourvu qu'il soit conforme à l'API. C'est très utile pour instancier les parsers DOM dont le standard ne définit que l'API pour la manipulation des documents et non pour obtenir le parser lui même, ce qui conduit à des codes fortement liés au parser utilisé. Un changement de parser en cours de projet peut se révéler alors douloureux. Moyennant ces quelques précautions, on pourra suivre le rythme effréné du développement des parsers XML et en changer si nécessaire. Tous les parsers récents respectent l'API du Sun. Project X de Sun
Ce logiciel est gratuit (même pour un usage commercial), et ses sources en sont disponibles (dans le répertoire src). Le parser de Sun est conforme à XML 1.0, SAX 1.0 et DOM level 1 et implante la version actuelle de XML Namespaces. Il peut tourner sur toute machine virtuelle Java 1.1.6 ou supérieure. Sun met à notre disposition deux parsers : un parser non validant com.sun.xml.parser.Parser (plus rapide) et un parser validant com.sun.xml.parser.ValidatingParser. Le parser non validant vérifie que le document est bien formé alors que le parser validant vérifie en plus qu'il est conforme à sa DTD. En plus des standards SAX et DOM, Sun fournit des classes étendant SAX pour implanter les Namespaces, mais aussi d'autres classes utilitaires, comme le TreeWalker permettant de naviguer aisément dans l'arbre du document. Le parser de Sun délivre des messages d'erreur particulièrement clairs. On notera cependant qu'il faut lui indiquer la Locale en_US pour ne pas obtenir des messages d'erreur incompréhensibles. Sans préciser la Locale, on obtient par exemple :
En indiquant la Locale, on obtient :
Ce qui est tout de même plus clair ! Le problème vient du fait que la méthode d'initialisation du parser (com.sun.xml.Parser.init()) choisit comme Locale la Locale par défaut de la VM (fr_FR pour une VM sous nos latitudes) qui n'est pas supportée. On pourra indiquer la Locale en_US avec le code suivant :
On trouvera http://www.sweetohm.com/html/projectx.html le code pour corriger ce bug ainsi que la traduction des messages d'erreur en Français. La documentation du parser fournit de nombreux exemples d'utilisation (dans le sous-répertoire examples). Mis à part ce problème, ce parser m'a semblé très fiable à l'utilisation. Sun a donné son parser au projet xml.apache.org, qui devrait à terme le faire fusionner avec le parser d'IBM (voir l' http://xml.apache.org/pr/0001.txt pour plus d'informations). Il sera bientôt disponible à l'URL suivante : http://xml.apache.org. Xerces-J (anciennement XML for Java) du projet xml.apache.org
Xerces-J est le nom du projet XML4J depuis qu'IBM en a fait don à xml.apache.org. Il est maintenant géré par ce dernier mais IBM continue de distribuer une version sur son site http://alphaworks.ibm.com/formula. La version 3 de XML4J est basée sur le code de Xerces-J mais XML4J fournit en plus une API de compatibilité avec les versions 2 (contenue dans le fichier xml4j.jar). Xerces-J est distribué sous forme de binaires (fichier JAR) et sous forme de sources. Xerces-J supporte SAX versions 1 et 2, DOM versions 1 et 2, ainsi que XML Schema. Le support de Schema, SAX 2 et DOM 2 est encore en développement. Il implémente d'autre part l'API JAXP de Sun pour les parsers XML. Xerces-J propose deux parsers : org.apache.xerces.parsers.SAXParser et org.apache.xerces.parsers.DOMParser. Il est possible de leur passer des propriétés ou des fonctionnalités à l'aide de l'interface org.xml.sax.Configurable de SAX2. Par exemple, pour que le parser soit validant, on pourra écrire :
Xerces-J gère les catalogues au format http://www.ccil.org/~cowan/XML/XCatalog.html (version 0.2) dérivé du format de catalogue SGML Open catalog format. Cette fonctionnalité me semble quasiment indispensable pour gérer les DTDs. Pour plus de détails, voir les fichiers org.apache.xerces.readers.XCatalog.java et org.apache.xerces.readers.XMLCatalog.java des sources. Des exemples sont disponibles dans le sous-répertoire samples. Ce parser (dans ses versions 1 et 2) m'a donné entière satisfaction, mais on peut lui reprocher ses messages d'erreur pas toujours très clairs. OpenXMLOpenXML (de Exoffice et Assaf Arkin) a longtemps été le seul parser XML en Open Source. Il a rejoint le projet xml.apache.org, mais n'est pas encore disponible sur le site Apache. Il supporte XML 1.0, SAX et DOM level 1, ainsi que les catalogues au format XCatalog (version 0.3) et XML Software Autoupdate. Aelfred
Ælfred est un analyseur très petit (le fichier Jar ne fait que 22 ko), ce qui le rend très intéressant pour un usage dans les applets par exemple. De plus, son occupation mémoire est très faible. Choix d'un parserLe parser étant la pièce maîtresse d'une application XML, faire le bon choix est primordial. On peut trouver des benchmarks testant les principaux parsers disponibles :
D'après ces benchmarks il semblerait que :
Cependant, ces tests commencent à dater et j'accorde personnellement peu de crédit aux benchmarks en général. Il ressort de mon expérience personnelle (ayant utilisé de manière intensive XML4J en versions 1 et 2 et ProjectX) que :
En outre, en produisant du code conforme aux standards, il est possible de changer de parser de manière simple. La meilleure solution me semble donc être de tester soi-même les parsers dans l'application. Processeurs XSLTLes processeurs XSL transforment un fichier XML en un fichier d'un autre format (html, texte ou LaTeX par exemple) à l'aide de feuilles de style XSL. Ils peuvent donc être invoqués sur la ligne de commande de la manière suivante :
Lorsqu'on utilise ces programmes pour traiter de petits fichiers sur la ligne de commande, il peut être utile (pour une question de vitesse d'exécution) de désactiver le compilateur JIT en ajoutant la ligne suivante dans le script de lancement :
Il est possible d'intégrer ces programmes dans une application. Il n'existe pas d'API commune à ces processeurs, mais tous utilisent un parser SAX ou DOM pour construire une représentation en mémoire du document. Le document à traiter pourra alors être communiqué au programme sous forme d'un DOM ou d'une InputSource SAX. XT de James Clark
Ce programme est sous licence de type Open Source et donc livré avec celles-ci. Cependant, l'absence totale de commentaires rend le code assez imperméable à toute modification ou amélioration. XT utilise un parser SAX pour lire les fichiers XML et XSL. Tout parser conforme au standard fait l'affaire. On peut lui passer le nom de la classe du parser sur la ligne de commande (sous forme d'une propriété système, -Dorg.xml.sax.parser=le.nom.du.parser). Il est possible de passer des arguments sur la ligne de commande (sous la forme nom=valeur). Ces arguments, de type chaîne de caractères, peuvent alors être utilisés dans le fichier XSL s'il définit le paramètre correspondant. XT peut être utilisé comme Servlet (avec un moteur de Servlet de version 2.1 ou supérieur), la classe correspondante est com.jclark.xsl.sax.XSLServlet. XT définit une API basée sur SAX (interface com.jclark.xsl.sax.XSLProcessor) et une API basée sur DOM (interface com.jclark.xsl.dom.TransformEngine). Cependant, la classe DOM est bien plus lente et moins fonctionnelle que celle basée sur SAX mais indispensable lorsque le document à traiter résulte de la manipulation d'un document DOM en mémoire. Il est même possible de mélanger ces deux méthodes. XT comporte quelques extensions par rapport à la norme, parmi lesquelles :
Ces extensions à la norme s'avèrent être très utiles (en particulier les deux premières) et l'on peut s'attendre à ce qu'elles soient un jour ajoutées au standard (dans la mesure où James Clark est partie prenante dans la définition de ces standards du W3C). Cependant, comme toute extension, elles interdisent toute migration vers un autre processeur XSL. Malgré quelques limitations (fonctionnalités de la proposition XSLT 1.0 non implantées) et quelques bugs connus, ce programme est très fonctionnel, respectueux des standards et rapide. On regrettera cependant le manque de messages d'erreur qui rend le débuggage de fichiers XSL pénible et l'absence de commentaires dans les sources. Contre toute attente, son auteur James Clark, en a arrêté le développement car son implémentation n'avait pour but que de tester la recommandation du W3 (dont il est l'éditeur). Des utilisateurs de XT ont cependant mis en place un site de http://4xt.org. Xalan-Java (anciennement LotusXSL) du projet xml.apache.orgXalan fait maintenant partie du projet xml.apache.org. Une version C++ est aussi disponible. Par défaut, Xalan est configuré pour fonctionner avec Xerces, mais il peut s'accommoder de tout parser DOM. Xalan peut produire des événements SAX, un DOM ou un document XML. Les feuilles de style sont lues par un parser SAX puis compilées (les expressions XPath et les traitements qui peuvent l'être sans connaître la structure du document XML à traiter). Il est nécessaire de créer une instance de Xalan par thread (deux threads ne peuvent partager la même instance). C'est certainement peu gênant pour la plupart des utilisations, mais je me demande si ce ne serait pas un problème pour les Servlets (on ne peut alors utiliser une même instance pour toutes les requêtes). Xalan permet de générer plusieurs fichiers à partir d'un unique fichier XSL lorsque la méthode de sortie est html, xml ou text. Xalan permet d'appeler une méthode Java ou JavaScript dans un script XSL. Le point fort de Xalan est le débuggage des fichiers XSL :
Il est possible d'utiliser Xalan de trois manières distinctes :
Pour finir, Xalan fournit une interface de débuggage. SaxonSaxon est un ensemble d'outils pour traiter les fichiers XML. Il comporte en particulier un processeur XSLT conforme au standard du W3C, ainsi qu'une bibliothèque Java rendant un service comparable à XSLT mais avec la possibilité de programmer - ce qui permet par exemple d'accéder à une base de données. Il utilise une version modifiée de Ælfred (passant les commentaires à l'application), mais tout analyseur SAX 2 fait l'affaire. Le processeur XSLT de Saxon permet de générer plusieurs documents à partir d'un seul fichier XML, de chaîner les feuilles de style à appliquer au document XML et de modifier les variables d'une feuille de style (qui ne peuvent normalement pas être modifiées, contrairement à ce que laisse supposer leur nom). XSL:P de Keith ViscoXSL:P fait maintenant partie du projet xml.apache.org. Il n'implante que le draft du 21.4.1999. (et n'est donc pas à jour par rapport au standard). Une version C++ est en développement (elle est présente sur le http://lxr.mozilla.org/seamonkey/source/extensions/transformiix). XSL:P peut utiliser XML4j versions 1.1.16 ou 2.0.x, OpenXML, Oracle XML Parser ou ProjectX. Il est configuré par défaut pour utiliser XML4J, mais on peut changer de parser en éditant le fichier xslp.properties dans le fichier JAR. L'originalité de XSL:P est de disposer de formatters permettant des formats de sortie divers. XSL:P soufre d'un problème de lenteur du à l'utilisation de DOM comme format de représentation en mémoire des documents. L'auteur semble envisager de fusionner XSL:P dans Xalan. Éditeurs XMLIl est possible d'éditer un document XML avec tout éditeur de texte. Cependant, il peut être utile de disposer d'un outil permettant de valider les documents, de connaître les éléments autorisés, etc. Emacs et PSGML
On ne présente plus Emacs, l'éditeur surpuissant. On peut quasiment tout faire avec (lire son courrier, les forums, éditer du code Java, ou même des fichiers XML, comme je suis en train de le faire en ce moment même). Emacs possède par défaut un mode SGML adapté à XML, mais ce mode est assez limité. Pour un usage intensif, on lui préférera PSGML, mode permettant d'éditer des fichiers SGML et (depuis sa version 1.2.0) des fichiers XML. On peut trouver une documentation, en français, sur l'installation de PSGML à l'adresse http://www.linux-france.org/article/appli/emacs/psgml-linuxdoc/sgml-tools-1/ (Attention ! cette documentation n'est plus à jour mais reste utile). La documentation du programme est assez complète, mais on peut trouver un livre complet sur l'utilisation de PSGML à l'adresse http://www.snee.com/bob/sgmlfree. On notera qu'il est nécessaire de taper M-X xml-mode pour éditer un fichier XML (sans quoi on l'édite en mode SGML, ce qui peut poser des problèmes). Il est aussi possible d'ajouter le commentaire suivant en fin de fichier pour passer au mode XML lors du chargement du fichier :
XED
XED est un éditeur validant (il lit les DTDs) codé en C, Python et Tk. Il facilite l'édition des fichiers XML (messages d'erreur, possibilité d'enlever les instructions et les commentaires, menu contextuel pour les éléments et attributs, etc.). La principale limitation de XED vient de l'utilisation de Python qui ne supporte pas l'UNICODE. Morphon XML Editor
XMLEditor est un éditeur XML écrit en Java. Il permet d'éditer graphiquement un fichier XML (avec une vue de l'arbre et une vue WYSIWYG). On peut aussi voir le résultat de la page HTML générée. La version testée utilisait pour le formatage un langage qui était une extension du standard XSL (appelé EXSL). La version actuelle utilise CSS et fournit un éditeur adéquat. On peut cependant se demander si le choix de XSLT n'aurait pas été plus judicieux. XML Pro
XML Pro est un éditeur XML commercial écrit en Java. Il présente une vue de l'arborescence du fichier dans laquelle il est possible d'insérer un élément, d'en supprimer, etc. Une VM 1.2 est nécessaire. Si la réalisation semble convenable, on regrettera l'absence d'un visualisateur (vers HTML par exemple) dans cet outil visuel. Les utilisateurs militants de Linux regretteront aussi que l'on nous impose le L&F Windows ! L'archive ne fournissant ni documentation, ni script de lancement (même pour Windows), on est bien embarrassé à l'installation du produit (on ne connaît pas la classe Java à invoquer !). Voici un script de lancement pour système UNIX :
Navigateurs et serveurs XMLUn navigateur XML permet de visualiser un fichier XML associé à une feuille de style (XSL, CSS ou autre). C'est un outil essentiel pour l'utilisation de XML à grande échelle sur l'internet et pourtant, les navigateurs XML opérationnels ne sont pas légion. InDelv XML Browser
La version de test de ce produit comporte un éditeur en version limitée dans le temps et un navigateur XML/XSL gratuit. L'ensemble est intéressant et plutôt stable. Le choix d'AWT peut être critiqué, mais il donne au programme une vitesse d'exécution très satisfaisante. De nombreux fichiers d'exemples (dont les oeuvres de Shakespeare) sont fournis, et on prend alors conscience de la puissance du concept : le navigateur charge les fichiers XML qui sont tous mis en forme avec la même feuille de style XSL spécifique aux oeuvres de l'auteur. Si le concept est très intéressant, le rendu graphique (et en particulier les polices) laissent un peu à désirer et on est encore loin du rendu d'un navigateur HTML comme Netscape. AmayaAmaya est le navigateur du W3C et permet de tester les nouveaux protocoles et formats de données. Il est disponible pour Windows et pour UNIX (un fichier RPM est disponible au téléchargement). Amaya comporte de plus un éditeur HTML/XHTML/MathML WYSIWYG gérant les feuilles de style CSS. En ce qui concerne XML, Amaya est capable d'afficher et d'éditer le XHTML et MathML. On peut en voir une démonstration sur http://www.w3.org/Amaya/MathExamples.html (mais il faut un navigateur capable d'afficher le MathML pour en profiter !). L'affichage des graphiques vectoriels XML SVG (Scalable Vector Graphics) est prévu pour une prochaine version. CocoonCocoon est une extension pour gérer le XML côté serveur. In nécessite un serveur HTTP muni d'un moteur de servlets (comme JServ ou Tomcat). Il permet :
Le but de Cocoon est de séparer la création, le traitement et la présentation du contenu XML d'un site, qui correspondent à des métiers distincts. En effet, le contenu des pages se trouve dans les fichiers XML, le traitement dans des balises XSP (jeu de balises associées à des traitements) et la présentation dans des feuilles de style XSL. Les créateurs de Cocoon voient un certain nombre de limitations à son utilisation :
Exemples de mise en oeuvrePour conclure cet exposé, je vous propose l'étude d'exemples de mise en oeuvre de XML dans divers domaines d'application. Génération de pagesWAP SDK In-Fusiohttp://www.in-fusio.com est une société Bordelaise proposant des services de jeu sur téléphone mobile. Elle développe entre autre des jeux WAP reposant sur PHP. Pour accélérer le développement de tels jeux (qui comportent tous une procédure d'identification, de gestion des scores, etc.) In-Fusio a développé la plateforme serveur GameZilla qui offre ces services. Le WAP SDK permet aux développeurs de jeux d'accéder aux services de GameZilla mais aussi de rendre le code du jeu indépendant de la plateforme cible. En particulier, le WML des pages doit être adapté aux deux principaux navigateurs WML que l'on trouve sur les téléphones mobiles (Nokia et Phone.com) et traduites suivant la langue de l'utilisateur. Il est bien sûr possible de le faire dynamiquement en PHP mais cela imbrique la présentation et la logique du jeu (les templates pour les différentes versions du WML sont noyés dans le code) et est gourmand en ressources (pour obtenir dynamiquement les messages traduits, il faut aller les chercher dans une base de données, ce qui peut impliquer plusieurs requêtes par page). À cette approche dynamique, nous avons préféré une approche statique:
Le programme de jeu doit être accompagné d'un fichier XML contenant la traduction des messages et les noms des fichiers des images suivant leur taille (fichier de ressources). Il doit être aussi accompagné d'un descripteur indiquant les configurations supportées (navigateurs, langues et tailles d'images). Lors de la compilation, le compilateur du SDK génère N répertoires comportant les fichiers compilés. Un répertoire correspond à une configuration possible (par exemple, navigateur Nokia, français et grandes images). Prenons le cas d'une page d'accueil d'un jeu:
Cette page comporte les particularités suivantes:
Fichier pour la configuration Phone.com/fr/petites images:
Dans ce fichier, l'élément <menu> a été remplacé par <select> et les éléments <item> par des <option>. Les références à des ressources texte ont été remplacées par les messages en français et les références à des images par leur valeur pour les petites images. Le fichier généré pour la configuration phone.com/en/grandes images est le suivant:
Dans ce fichier, l'élément <menu> a été remplacé par une liste d'éléments <a href="">, les références à des ressources texte ont été remplacées par les messages en anglais et les références à des images par leur valeur pour les grandes images. Cette approche amène beaucoup de souplesse:
Sites des Éditions O'ReillyPourquoi avoir choisi XML ?
Le choix de XML nous a semblé le meilleur pour plusieurs raisons :
Choix techniques
Les informations pouvant être raisonnablement mises à jour quotidiennement, nous avons opté pour une solution de compilation statique des pages du site : les pages HTML sont générées à partir des sources XML puis envoyées au serveur. Il existe deux autres solutions :
Architecture
Le site est généré entièrement à chaque compilation (pour éviter des problèmes de dépendances) à partir d'une arborescence de fichiers XML. Les fichiers de même type sont placés dans le même répertoire. Les types de fichiers sont au nombre de six :
Les pages d'index (la page d'accueil et les pages des catégories) sont générées par des fichiers XSL appliqués sur l'index XML du site : un fichier XML regroupant tous les fichiers XML des sources. Il est ainsi possible de générer les listes des ouvrages classées par ordre alphabétique, la liste des brèves classées par date, etc. Ainsi, la page d'accueil regroupe des fragments de nombre de fichiers XML :
Figure 2: Structure de la page d'accueil du site Les fichiers à l'origine des différentes zones de cette page sont les suivants :
Pour conclure, je dirais que XML permet de gérer un tel site de manière rationnelle et en préservant les investissements des Éditions O'Reilly du fait que XML est un standard et donc à l'abri du bon vouloir d'un unique éditeur de logiciel. Programmation d'applications modulairesL'idée de cette approche de la programmation est de charger un arbre de Beans à partir d'un fichier de configuration XML. on peut en effet assez facilement définir une syntaxe pour "mapper" des beans sur des éléments XML:
Par exemple, le fichier XML suivant:
Lors du parsing de ce fichier, le parser va réaliser les actions suivantes:
On obtient en mémoire une structure du type:
Figure 3: Arbre de beans en mémoire Cette approche est très utile dans la mesure où ce système permet une configuration simple du programme (il suffit de modifier le fichier XML, avec un simple éditeur ou un outil graphique dédié). D'autre part, il est très extensible: pour utiliser un nouveau type de bean, il suffit de le placer dans le CLASSPATH du programme, de placer son élément associé dans le fichier de configuration et le tour est joué ! Cette approche commence à prendre une grande importance en programmation Java et il me semble que c'est maintenant un paradigme incontournable utilisé dans un nombre croissant d'applications récentes. Nous allons maintenant voir un certain nombre d'exemples de mise en oeuvre de cette approche: Système de Log de GameZillaLes logs sont envoyés (par RMI) au serveur de log qui les empile (pour rendre la main immédiatement au client). Les logs sont dépilés par un Consumer qui les envoie aux tuyaux pour filtrage et sérialisation. L'architecture d'un tuyau de log est la suivante:
Figure 4: Architecture du serveur de logs de GameZilla Le filtre permet de sélectionner les logs à sérialiser dans ce canal de log. Les logs passent ensuite par les channels qui définissent un moyen de persistance (dans des fichiers, dans une BD, par mail ou sur la console). Pour configurer ce système, nous avons mis en oeuvre la technique de mapping XML/Beans exposée ci-dessus. Voici un exemple de fichier de configuration d'un tuyau de logs:
Ce fichier de configuration indique que:
L'arbre d'objets associés à un tuyau est construit à partir du fichier de configuration puis les logs y sont envoyés lors du fonctionnement du serveur. L'avantage de cette solution est que sa mise en oeuvre est relativement simple et il n'est pas nécessaire de développer un outil graphique dans la phase de développement. Pour la configuration à chaud, les fichiers sont envoyés à l'interface d'administration par RMI. Le serveur stoppe les threads de consommation de la pile de logs, construit l'arbre des tuyaux puis relance les threads. D'autre part, le système est facilement extensible car il suffit, pour ajouter un channel (SMS par exemple), de développer le bean correspondant (en implémentant une interface propre aux channels) , de le placer dans le CLASSPATH puis de changer le fichier de configuration. Free Java InstallerCe programme est un auto-installeur Java sous licence GPL. Il permet de construire un jar qui est un programme d'installation. Examinons un exemple de fichier de configuration:
Chacun des éléments de ce fichier correspond à une étape de cette installeur (une tâche):
Figure 5: Écran d'acceuil Cet écran correspond à l'élément XML suivant:
Figure 6: Écran de licence Celui-ci correspond au suivant:
Lors de la construction de l'installeur, le fichier XML de configuration est parsé et l'arbre de beans (qui étendent la classe Task) construit. Cet arbre est ensuite sérialisé dans le fichier jar qui constitue l'installeur. Lorsque l'installeur est lancé, il désérialise l'arbre des tâches et appelle la méthode process sur le bean racine. Le fichier XML de configuration n'est plus nécessaire et n'est donc pas embarqué dans le fichier jar. Cette approche permet de rendre le programme extensible du fait que l'on peut programmer d'autres tâches. Pour les utiliser, il suffit de les placer dans le CLASSPATH et de les invoquer dans le fichier de configuration. Cette technique qui me semble extrèmement prometteuse est de plus en plus utilisée en programmation Java. On pourra en particulier étudier le fonctionnement du programme http://jakarta.apache.org/ant qui repose sur le même principe. Dernière mise à jour : 2001-01-28 |