<html> <head> <META http-equiv="Content-Type" content="text/html; charset=US-ASCII"> <title>Cafe Babe</title> </head> <body bgcolor="#FFFFFF" text="#000000" link="#00D0A0" vlink="#0090D0"> <table border="0" cellpadding="10" cellspacing="0" width="100%"> <tr> <td width="150" bgcolor="#0090D0" align="left" valign="top"><font size="-1"> <table border="0" width="100%" cellpadding="0"> <tr> <td align="left"><a href="../index.html"><img src="../img/menu.fr.png" border="0"></a></td><td align="right"><a href="../index.en.html"><img src="../img/menu.en.png" border="0"></a></td> </tr> </table> <hr> <table border="0" width="100%" cellpadding="0"> <tr> <td align="left"><font color="#00D0A0"> 	 Home page de<br> <a href="mailto:casa@sweetohm.net"> 	  Michel Casabianca 	 </a></font></td> </tr> </table> <hr>   <center> <img src="../img/menu.cafebabe.png" border="0"></center>   <table border="0" width="100%" cellpadding="5" cellspacing="0"> <tr> <td align="center" bgcolor="#00D0A0"><font color="#FFFFFF"><strong>Outils</strong></font></td> </tr> <tr> <td bgcolor="#FFFFFF"> <table border="0" width="100%" cellpadding="3" cellspacing="0"> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./sat.html">T&acirc;ches Ant</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./fiji.html">Installeur Java</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./vsql.html">Visual SQL</a> <br> </td> </tr> </table> </td> </tr> </table> <br>   <table border="0" width="100%" cellpadding="5" cellspacing="0"> <tr> <td align="center" bgcolor="#00D0A0"><font color="#FFFFFF"><strong>Conf&eacute;rences</strong></font></td> </tr> <tr> <td bgcolor="#FFFFFF"> <table border="0" width="100%" cellpadding="3" cellspacing="0"> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./j2ee-os.html">Outils J2EE Open Source</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./java-xml.html">D&eacute;v. XML en Java sous Linux</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./java-linux.html">Outils de d&eacute;v. Java sous Linux</a> <br> </td> </tr> </table> </td> </tr> </table> <br>   <table border="0" width="100%" cellpadding="5" cellspacing="0"> <tr> <td align="center" bgcolor="#00D0A0"><font color="#FFFFFF"><strong>Articles XML</strong></font></td> </tr> <tr> <td bgcolor="#FFFFFF"> <table border="0" width="100%" cellpadding="3" cellspacing="0"> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./intro-xml.html">Introduction &agrave; XML</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./intro-xslt.html">Introduction &agrave; XSLT</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./xml-java.html">D&eacute;veloppement XML en Java</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./ant-web.html">G&eacute;n&eacute;rer des sites web avec Ant</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./ant-dtd.html">DTD Ant</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./projectx.html">Project X</a> <br> </td> </tr> </table> </td> </tr> </table> <br>   <table border="0" width="100%" cellpadding="5" cellspacing="0"> <tr> <td align="center" bgcolor="#00D0A0"><font color="#FFFFFF"><strong>Articles Java</strong></font></td> </tr> <tr> <td bgcolor="#FFFFFF"> <table border="0" width="100%" cellpadding="3" cellspacing="0"> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./kfm-jar.html">KFM et Jars</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./java-mail.html">Mails en Java</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./java-preprocesseur.html">Java et pr&eacute;processeur</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./java-image.html">Java et images</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./java-threads.html">Threads</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./java-evenements.html">&Eacute;v&eacute;nements</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./java-astuces.html">Astuces</a> <br> </td> </tr> </table> </td> </tr> </table> <br>   <table border="0" width="100%" cellpadding="5" cellspacing="0"> <tr> <td align="center" bgcolor="#00D0A0"><font color="#FFFFFF"><strong>Weblog</strong></font></td> </tr> <tr> <td bgcolor="#FFFFFF"> <table border="0" width="100%" cellpadding="3" cellspacing="0"> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./weblog.html">Weblog Cafe</a> <br> </td> </tr> </table> </td> </tr> </table> <br>   <hr>   <center> <img src="../img/menu.sweetohm.png" border="0"></center>   <table border="0" width="100%" cellpadding="5" cellspacing="0"> <tr> <td align="center" bgcolor="#00D0A0"><font color="#FFFFFF"><strong>Jeux</strong></font></td> </tr> <tr> <td bgcolor="#FFFFFF"> <table border="0" width="100%" cellpadding="3" cellspacing="0"> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./awele.html">Awele</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./atomx.html">AtomX</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./corewarrior.html">Core Warrior</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./solitaire.html">Solitaire</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./spicewars.html">SpiceWars</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./tangram.html">Tangram</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./taquin.html">Taquin</a> <br> </td> </tr> </table> </td> </tr> </table> <br>   <table border="0" width="100%" cellpadding="5" cellspacing="0"> <tr> <td align="center" bgcolor="#00D0A0"><font color="#FFFFFF"><strong>Simulations</strong></font></td> </tr> <tr> <td bgcolor="#FFFFFF"> <table border="0" width="100%" cellpadding="3" cellspacing="0"> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./vie.html">Jeu de la vie</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./langton.html">Fourmi de Langton</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./couvain.html">Tri du couvain</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./chasse.html">Piste de chasse</a> <br> </td> </tr> </table> </td> </tr> </table> <br>   <table border="0" width="100%" cellpadding="5" cellspacing="0"> <tr> <td align="center" bgcolor="#00D0A0"><font color="#FFFFFF"><strong>Graphisme</strong></font></td> </tr> <tr> <td bgcolor="#FFFFFF"> <table border="0" width="100%" cellpadding="3" cellspacing="0"> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./fractales.html">Fractales</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./3d.html">Images 3D</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./powered.html">Powered by ...</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./duke.html">Ecce Duke</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./tie.html">TIE</a> <br> </td> </tr> </table> </td> </tr> </table> <br>   <table border="0" width="100%" cellpadding="5" cellspacing="0"> <tr> <td align="center" bgcolor="#00D0A0"><font color="#FFFFFF"><strong>&Agrave; propos</strong></font></td> </tr> <tr> <td bgcolor="#FFFFFF"> <table border="0" width="100%" cellpadding="3" cellspacing="0"> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./auteur.html">De l'auteur</a> <br> </td> </tr> <tr> <td valign="top"><img src="../img/menu.puce.png" border="0" alt="o"></td><td valign="top"><a href="./site.html">De ce site</a> <br> </td> </tr> </table> </td> </tr> </table> <br>  <hr> <br> <a href="http://java.sun.com"><img src="../img/menu.java-powered.png" alt="Powered by Java" border="0"></a> <br> <br> <a href="http://www.xml.org"><img src="../img/menu.xml-powered.png" alt="Powered by XML" border="0"></a> <br> <br> <a href="http://www.linux.org"><img src="../img/menu.linux-powered.png" alt="Powered by Linux" border="0"></a></font> </td><td valign="top"><img src="http://www.sdv.fr/cgi/gene/counter/nph-count?width=5&amp;link=casa /html/.html" alt="Counter" border="0" width="1" height="1"><center> <h1> <font color="#0090D0">D&eacute;veloppement XML en Java sous Linux</font> </h1> <font size="-1">Michel CASABIANCA&nbsp;-&nbsp;<a href="mailto:casa@sweetohm.net">casa@sweetohm.net</a></font> </center> <br> <hr noshade="true" size="1"> <font size="-1"><i>   <p>Ce document pr&eacute;sente une br&egrave;ve introduction &agrave; XML, les outils    Java de d&eacute;veloppement ainsi que des exemples de mise en oeuvre de    XML.</p>  </i></font> <hr noshade="true" size="1"> <br> <table width="100%" border="1" cellpadding="10" cellspacing="0" bgcolor="#F0FFF0"> <tr> <td> <center> <font color="#0090D0"> <h2> 	   Table des mati&egrave;res 	  </h2> </font> </center> <br> <br> <font size="+1"><a href="#1">Introduction &agrave; XML</a></font> <br>&nbsp;&nbsp;&nbsp;<font size="+0"><a href="#1.1">Origines</a></font> <br>&nbsp;&nbsp;&nbsp;<font size="+0"><a href="#1.2">Caract&eacute;ristiques de XML</a></font> <br>&nbsp;&nbsp;&nbsp;<font size="+0"><a href="#1.3">Comparaison avec HTML</a></font> <br>&nbsp;&nbsp;&nbsp;<font size="+0"><a href="#1.4">Document Type Definitions</a></font> <br>&nbsp;&nbsp;&nbsp;<font size="+0"><a href="#1.5">Feuilles de style</a></font> <br>&nbsp;&nbsp;&nbsp;<font size="+0"><a href="#1.6">&Eacute;change de donn&eacute;es textuelles entre programmes</a></font> <br>&nbsp;&nbsp;&nbsp;<font size="+0"><a href="#1.7">Standards d&eacute;riv&eacute;s</a></font> <br>&nbsp;&nbsp;&nbsp;<font size="+0"><a href="#1.8">APIs</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-1"><a href="#1.8.1">SAX</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-1"><a href="#1.8.2">DOM</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-1"><a href="#1.8.3">Java API for XML Parsing</a></font> <br> <font size="+1"><a href="#2">Outils pour XML</a></font> <br>&nbsp;&nbsp;&nbsp;<font size="+0"><a href="#2.1">Le projet xml.apache.org</a></font> <br>&nbsp;&nbsp;&nbsp;<font size="+0"><a href="#2.2">Parsers XML</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-1"><a href="#2.2.1">Project X de Sun</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-1"><a href="#2.2.2">Xerces-J (anciennement XML for Java) du projet xml.apache.org</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-1"><a href="#2.2.3">OpenXML</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-1"><a href="#2.2.4">Aelfred</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-1"><a href="#2.2.5">Choix d'un parser</a></font> <br>&nbsp;&nbsp;&nbsp;<font size="+0"><a href="#2.3">Processeurs XSLT</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-1"><a href="#2.3.1">XT de James Clark</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-1"><a href="#2.3.2">Xalan-Java (anciennement LotusXSL) du projet xml.apache.org</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-1"><a href="#2.3.3">Saxon</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-1"><a href="#2.3.4">XSL:P de Keith Visco</a></font> <br>&nbsp;&nbsp;&nbsp;<font size="+0"><a href="#2.4">&Eacute;diteurs XML</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-1"><a href="#2.4.1">Emacs et PSGML</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-1"><a href="#2.4.2">XED</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-1"><a href="#2.4.3">Morphon XML Editor</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-1"><a href="#2.4.4">XML Pro</a></font> <br>&nbsp;&nbsp;&nbsp;<font size="+0"><a href="#2.5">Navigateurs et serveurs XML</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-1"><a href="#2.5.1">InDelv XML Browser</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-1"><a href="#2.5.2">Amaya</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-1"><a href="#2.5.3">Cocoon</a></font> <br> <font size="+1"><a href="#3">Exemples de mise en oeuvre</a></font> <br>&nbsp;&nbsp;&nbsp;<font size="+0"><a href="#3.1">G&eacute;n&eacute;ration de pages</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-1"><a href="#3.1.1">WAP SDK In-Fusio</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-1"><a href="#3.1.2">Sites des &Eacute;ditions O'Reilly</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-2"><a href="#3.1.2.1">Pourquoi avoir choisi XML ?</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-2"><a href="#3.1.2.2">Choix techniques</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-2"><a href="#3.1.2.3">Architecture</a></font> <br>&nbsp;&nbsp;&nbsp;<font size="+0"><a href="#3.2">Programmation d'applications modulaires</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-1"><a href="#3.2.1">Syst&egrave;me de Log de GameZilla</a></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="+-1"><a href="#3.2.2">Free Java Installer</a></font> <br> </td> </tr> </table>    <p>Pour t&eacute;l&eacute;charger la derni&egrave;re version de ce document :</p>    <center> <table border="1" cellpadding="10" cellspacing="0">    <tr>     <td bgcolor="#D0FFD0" align="left" valign="top"><font color="#000000">HTML</font></td>     <td bgcolor="#D0FFD0" align="left" valign="top"><font color="#000000"><a href="http://www.cafebabe.net/html/java-xml.html">http://www.cafebabe.net/html/java-xml.html</a></font></td>    </tr>    <tr>     <td bgcolor="#D0D0FF" align="left" valign="top"><font color="#000000">PDF</font></td>     <td bgcolor="#D0D0FF" align="left" valign="top"><font color="#000000"><a href="http://www.cafebabe.net/arc/java-xml.pdf">http://www.cafebabe.net/arc/java-xml.pdf</a></font></td>    </tr>   </table> </center>    <font color="#0090D0"> <h2> <a name="1">Introduction &agrave; XML</a> </h2> </font>     <font color="#0090D0"> <h3> <a name="1.1">Origines</a> </h3> </font>     <ul>      <li>Recommandation du W3C : <a href="http://www.w3.org/TR/REC-xml">http://www.w3.org/TR/REC-xml</a>      </li>      <li>Traduction en fran&ccedil;ais : <a href="http://babel.alis.com/web_ml/xml/REC-xml.fr.html">http://babel.alis.com/web_ml/xml/REC-xml.fr.html</a> </li>      <li>Naissance de XML : <a href="http://java.sun.com/xml/birth_of_xml.html">http://java.sun.com/xml/birth_of_xml.html</a> </li>     </ul>      <p>XML (eXtensible Markup Language) est n&eacute; du constat que le HTML n'est      pas adapt&eacute; aux futures exigences de l'internet. Des ing&eacute;nieurs ont       alors eu l'id&eacute;e de remplacer le HTML par SGML (Standard Generalized       Markup Language), seul syst&egrave;me capable &agrave; l'&eacute;poque de succ&eacute;der au      HTML.</p>      <p>Jon Bosak, qui travaillait pour Sun, a alors &eacute;t&eacute; charg&eacute; par le W3C      de "mettre le SGML sur le web". Le travail de d&eacute;finition de ce qui       allait devenir le XML (suggestion du gourou SGML James Clark) a dur&eacute;      onze semaines (de la fin ao&ucirc;t 1996 &agrave; novembre de la m&ecirc;me ann&eacute;e, date      de publication du premier draft). Les finitions ont pris encore une      ann&eacute;e et la version 1.0 de la norme a &eacute;t&eacute; publi&eacute;e en f&eacute;vrier 1998.</p>      <p>L'id&eacute;e du groupe de travail du W3C &eacute;tait de cr&eacute;er un langage de      balisage hypertexte aussi simple &agrave; apprendre et utiliser que le HTML      et aussi puissant que le SGML. C'est une d&eacute;marche similaire qui a      conduit Sun &agrave; d&eacute;velopper Java (simplification du C++).</p>         <font color="#0090D0"> <h3> <a name="1.2">Caract&eacute;ristiques de XML</a> </h3> </font>     <ul>      <li>Introduction &agrave; XML : <a href="http://www.javaworld.com/javaworld/jw-04-1999/jw-04-xml.html">http://www.javaworld.com/javaworld/jw-04-1999/jw-04-xml.html</a> </li>     </ul>      <p>XML reprend donc les principales caract&eacute;ristiques qui font la      puissance de SGML :</p>      <ul>      <li>L'utilisateur est libre de cr&eacute;er son propre jeu de balises       (ou <i>&eacute;l&eacute;ments</i>).</li>      <li>Il en d&eacute;finit la syntaxe dans un fichier s&eacute;par&eacute;, appel&eacute;       <i>DTD</i> (pour Document Type Definition).</li>      <li>Il est possible d'inclure la DTD dans l'en t&ecirc;te du       fichier XML lui-m&ecirc;me (document <i>stand alone</i>) ou m&ecirc;me       de cr&eacute;er des documents sans DTD.</li>      <li>Un fichier XML est dit <i>bien form&eacute;</i> s'il se conforme       &agrave; la syntaxe g&eacute;n&eacute;rale du XML (par exemple, tout &eacute;l&eacute;ment ouvert doit       &ecirc;tre referm&eacute;).</li>      <li>Un fichier XML sera dit <i>valide</i> s'il est        <i>bien form&eacute;</i> et est conforme &agrave; la syntaxe d&eacute;finie dans sa        DTD.</li>     </ul>         <font color="#0090D0"> <h3> <a name="1.3">Comparaison avec HTML</a> </h3> </font>      <p>Pour comprendre l'int&eacute;r&ecirc;t du XML, on peut le comparer au HTML qui      a le m&eacute;rite d'&ecirc;tre connu de tous. Pour la d&eacute;monstration, je prendrai      l'exemple d'un r&eacute;pertoire d'adresses.</p>      <p>Voici l'allure du fichier HTML :</p>       <blockquote> <font color="#00A070"> <pre>   &lt;html&gt;     &lt;head&gt;&lt;title&gt;R&amp;#233;pertoire&lt;/title&gt;&lt;/head&gt;     &lt;body&gt;     &lt;center&gt;&lt;h1&gt;Mon r&amp;#233;pertoire&lt;/h1&gt;&lt;/center&gt;     &lt;h2&gt;Michel Casabianca&lt;/h2&gt;      &lt;p&gt;Expert Java et XML (In-Fusio)&lt;/p&gt;      &lt;p&gt;&lt;bf&gt;Adresse:&lt;/bf&gt;&lt;/p&gt;      &lt;p&gt;23, parvis des Chartrons&lt;br&gt;         33074 Bordeaux&lt;/p&gt;      &lt;p&gt;T&eacute;l&eacute;phone: 05.56.79.92.00&lt;/p&gt;      &lt;p&gt;Mobile: 06.81.71.72.44&lt;/p&gt;      &lt;p&gt;email: michelc@in-fusio.com&lt;/p&gt;      &lt;p&gt;www: www.in-fusio.com&lt;/p&gt;     &lt;/body&gt;    &lt;/html&gt;      </pre> </font> </blockquote>      <p>Le moins que l'on puisse dire est que le source HTML n'est pas      particuli&egrave;rement clair !</p>        <p>Voici maintenant l'allure du fichier XML :</p>         <blockquote> <font color="#00A070"> <pre>   &lt;?xml version="1.0" encoding="iso-8859-1"?&gt;      &lt;!DOCTYPE repertoire PUBLIC "-//CASA//DTD repertoire//FR" "repertoire.dtd"&gt;      &lt;repertoire&gt;       &lt;personne&gt;      &lt;prenom&gt;Michel&lt;/prenom&gt;      &lt;nom&gt;Casabianca&lt;/nom&gt;      &lt;qualite&gt;Expert Java et XML&lt;/qualite&gt;      &lt;entreprise&gt;In-Fusio&lt;/entreprise&gt;      &lt;adresse lieu="travail"&gt;        &lt;rue&gt;23, parvis des Chartrons&lt;/rue&gt;        &lt;cp&gt;33074&lt;/cp&gt;        &lt;ville&gt;Bordeaux&lt;/ville&gt;        &lt;pays&gt;France&lt;/pays&gt;        &lt;telephone&gt;05.56.79.92.00&lt;/telephone&gt;        &lt;mobile&gt;06.81.71.72.44&lt;/mobile&gt;        &lt;email&gt;michelc@in-fusio.com&lt;/email&gt;        &lt;www&gt;www.in-fusio.com&lt;/www&gt;      &lt;/adresse&gt;    &lt;/personne&gt;      &lt;/repertoire&gt;      </pre> </font> </blockquote>      <p>Ce source XML contient les m&ecirc;mes informations, mais il pr&eacute;sente les      avantages suivants :</p>      <ul>      <li>Il ne m&eacute;lange pas l'<i>information</i> contenue dans le       document et sa <i>pr&eacute;sentation</i> comme le fait le HTML.        Par exemple, l'&eacute;l&eacute;ment &lt;title&gt; du HTML contient de l'information       exploitable alors que l'&eacute;l&eacute;ment &lt;center&gt; ne sert qu'&agrave; indiquer       une mise en forme. La r&eacute;daction du contenu et sa mise en forme       correspondant &agrave; deux m&eacute;tiers diff&eacute;rents, il n'est pas logique de       les m&eacute;langer.</li>      <li>Cette s&eacute;paration du contenu et de la forme permet        d'<i>extraire</i> des informations du document. Une application       peut en effet faire une liste des entr&eacute;es du r&eacute;pertoire (pour       les injecter dans une base de donn&eacute;es par exemple) si elle sait       que le nom d'une personne est encadr&eacute; par un &eacute;l&eacute;ment &lt;nom&gt;, son       pr&eacute;nom par un &eacute;l&eacute;ment &lt;prenom&gt;, etc. Cette t&acirc;che peut &ecirc;tre       r&eacute;alis&eacute;e de mani&egrave;re <i>fiable</i> et <i>standard</i> par       un <i>parser</i> XML.</li>     </ul>          <font color="#0090D0"> <h3> <a name="1.4">Document Type Definitions</a> </h3> </font>      <p>On peut fixer la grammaire d'un type de document      &agrave; l'aide d'une DTD (pour Document Type Definition). Celle de      notre exemple de r&eacute;pertoire permet d'imposer que toute entr&eacute;e      comporte un nom et un pr&eacute;nom, une qualit&eacute;, etc. Pour notre      r&eacute;pertoire, cette DTD pourrait ressembler &agrave; la suivante:</p>       <blockquote> <font color="#00A070"> <pre>   &lt;?xml version="1.0" encoding="iso-8859-1"?&gt;    &lt;!ENTITY % lieux "travail | domicile | vacances"&gt;    &lt;!ELEMENT repertoire (personne+)&gt;    &lt;!ELEMENT personne (prenom, nom, qualite, entreprise, adresse+)&gt;    &lt;!ELEMENT prenom (#PCDATA)&gt;   &lt;!ELEMENT nom (#PCDATA)&gt;   &lt;!ELEMENT qualite (#PCDATA)&gt;   &lt;!ELEMENT entreprise (#PCDATA)&gt;    &lt;!ELEMENT adresse (rue, cp, ville, pays, telephone, mobile?, email?, www?)&gt;   &lt;!ATTLIST adresse lieu (%lieux;) "travail"&gt;    &lt;!ELEMENT rue (#PCDATA)&gt;   &lt;!ELEMENT cp (#PCDATA)&gt;   &lt;!ELEMENT ville (#PCDATA)&gt;   &lt;!ELEMENT pays (#PCDATA)&gt;   &lt;!ELEMENT telephone (#PCDATA)&gt;   &lt;!ELEMENT mobile (#PCDATA)&gt;   &lt;!ELEMENT email (#PCDATA)&gt;   &lt;!ELEMENT www (#PCDATA)&gt;       </pre> </font> </blockquote>      <p>Un document muni d'une DTD peut &ecirc;tre <i>valid&eacute;</i> ce qui       certifie qu'il est conforme &agrave; 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 <i>Schema</i> qui propose des      conditions beaucoup plus fines pour les types de document.</p>          <font color="#0090D0"> <h3> <a name="1.5">Feuilles de style</a> </h3> </font>     <ul>      <li>Introduction &agrave; XSL :        <a href="http://metalab.unc.edu/xml/books/bible/updates/14.html">http://metalab.unc.edu/xml/books/bible/updates/14.html</a>      </li>     </ul>      <p>Bien s&ucirc;r, on peut se poser la question de savoir comment on      peut visualiser un fichier XML dans la mesure o&ugrave; les balises ne      donnent aucune indication sur la pr&eacute;sentation du document. Pour      pouvoir afficher un fichier XML, il faut donc lui associer une      <i>feuille de style</i>. Celle-ci permet de le transformer en      un document (HTML ou autre) que l'on peut afficher.</p>      <p> <center> <img src="../img/java-xml.xslt.png" vspace="10" hspace="10"><br> <font color="#0090D0">Figure&nbsp;1:&nbsp;Transformation XSLT</font> </center> </p>      <p>XSLT (eXtensible Style Language, Transformation) est un standard       du W3C permettant de <i>transformer</i> 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&ecirc;me un fichier XML op&eacute;rant une transformation      sur l'<i>arbre</i> du document XML.</p>      <p>Une feuille de style XSLT est essentiellement constitu&eacute;e de      <i>templates</i>. Un template transforme un &eacute;l&eacute;ment XML en      un texte quelconque dans le document r&eacute;sultant (par exemple en      un tag HTML). Pour transformer un nom de notre r&eacute;pertoire en      un tag &lt;h2&gt;, nous pourrions d&eacute;finir le template suivant:</p>       <blockquote> <font color="#00A070"> <pre>   &lt;xsl:template match="nom"&gt;     &lt;h2&gt;&lt;xsl:apply-templates/&gt;&lt;/h2&gt;   &lt;/xsl:template&gt;       </pre> </font> </blockquote>      <p>On aura compris que la modification de la <i>pr&eacute;sentation</i> 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).</p>      <p>XSLT va cependant plus loin que d'autres langages de feuille de      style (comme CSS) car il permet de manipuler la <i>structure</i>      du document. On peut ainsi g&eacute;n&eacute;rer automatiquement un index      de notre r&eacute;pertoire et le trier par ordre alphab&eacute;tique par nom ou      entreprise par exemple.</p>      <p>On peut aussi transformer un fichier XML de type <i>A</i> en un      document de type <i>B</i>, passant ainsi d'une DTD &agrave; une autre       (si les informations sont compatibles). XSLT est donc aussi un      langage de transformation entre DTD.</p>          <font color="#0090D0"> <h3> <a name="1.6">&Eacute;change de donn&eacute;es textuelles entre programmes</a> </h3> </font>      <p>XML 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&ccedil;on fiable, il permet l'&eacute;change      d'information entre programmes.</p>      <p>Cette utilisation de XML a de beaux jours devant elle car un      fichier XML pr&eacute;sente de nombreux avantages sur un fichier binaire      ou texte "plat":</p>      <ul>      <li>Il est ind&eacute;pendant de la plateforme (il utilise l'encodage       Unicode pour les caract&egrave;res).</li>      <li>Il est ind&eacute;pendant du langage de programmation.</li>      <li>Il est manipulable par un simple &eacute;diteur de texte.</li>      <li>Les outils pour le manipuler sont standards (les parsers       XML sont l&eacute;gions et on en trouve pour quasiment tous les       langages de programmation).</li>     </ul>      <p>Par exemple, XML-RPC permet d'appeler des m&eacute;thodes sur une machine      distante gr&acirc;ce &agrave; un protocole utilisant XML. Il pr&eacute;sente, par       rapport &agrave; RMI par exemple, l'avantage d'&ecirc;tre ind&eacute;pendant du      langage (alors que RMI est li&eacute; &agrave; Java) et de la plateforme.</p>      <p>XML est tr&egrave;s utilis&eacute; comme format de donn&eacute;es textuelles,      voir les exemples de mise en oeuvre &agrave; la fin de cet article      pour des applications concr&egrave;tes.</p>          <font color="#0090D0"> <h3> <a name="1.7">Standards d&eacute;riv&eacute;s</a> </h3> </font>     <ul>      <li>Liste de sp&eacute;cifications XML : <a href="http://www.xml.org/xmlorg_registry/index.shtml">http://www.xml.org/xmlorg_registry/index.shtml</a>      </li>     </ul>      <p>Un int&eacute;r&ecirc;t de XML est donc l'&eacute;change d'informations. Pour que cet      &eacute;change soit possible, il faut que les acteurs d'un secteur se      mettent d'accord sur une DTD commune.</p>      <p>On voit donc &eacute;merger quotidiennement de nouvelles sp&eacute;cifications      pour toutes sortes de domaines d'activit&eacute; (allant de la notation      musicale au commerce &eacute;lectronique).</p>      <p>Il a ainsi &eacute;t&eacute; d&eacute;finit un standard pour la notation de formules      math&eacute;matiques : <a href="http://www.w3.org/TR/REC-MathML/">http://www.w3.org/TR/REC-MathML/</a>. IBM propose un       <a href="http://www.software.ibm.com/network/techexplorer/">http://www.software.ibm.com/network/techexplorer/</a> pour visualiser des formules      &eacute;crites dans ce format et Amaya permet de les visualiser depuis peu.</p>      <p>Cependant, il risque d'appara&icirc;tre un probl&egrave;me : celui de la      multiplication des DTD concurrentes nuisant &agrave; toute standardisation      (voir l'article <a href="http://www.xmltechno.com/focus/2000_08_28_standards/standards_xml_p1.cfm">http://www.xmltechno.com/focus/2000_08_28_standards/standards_xml_p1.cfm</a>).      On peut n&eacute;anmoins esp&eacute;rer que l'on rem&eacute;die &agrave; cette situation, pour      plusieurs raisons :</p>      <ul>      <li>XSLT permet de convertir un document vers une autre DTD. Si       les informations contenues dans les documents sont semblables, la       conversion devrait &ecirc;tre possible dans la plupart des cas (seule       l'exp&eacute;rience nous le dira).</li>      <li>Il est tr&egrave;s probable qu'une s&eacute;lection s'op&egrave;re rapidement       et qu'il ne reste qu'un seul format dans chaque domaine d'activit&eacute;       (ou un petit nombre de formats inter-op&eacute;rables).      </li>     </ul>      <p>C'est &agrave; mon sens le seul nuage assombrissant l'avenir de XML.</p>          <font color="#0090D0"> <h3> <a name="1.8">APIs</a> </h3> </font>      <p>Le langage XML &eacute;tant un standard, il permet l'&eacute;change d'informations      entre applications. L'&eacute;tape suivante est en toute logique la       standardisation de l'API des parsers (composants logiciels permettant      d'acc&eacute;der facilement aux donn&eacute;es contenues dans un document XML).       C'est le but de SAX (Simple API for XML) et de DOM (Document Object       Model).</p>      <font color="#0090D0"> <h4> <a name="1.8.1">SAX</a> </h4> </font>      <ul>       <li>Norme SAX : <a href="http://www.megginson.com/SAX/index.html">http://www.megginson.com/SAX/index.html</a>       </li>      </ul>       <p>Le principe du parser SAX est simple : on lui raccorde des objets       dont les m&eacute;thodes (implantant des interfaces pr&eacute;cises) sont appel&eacute;es       par le parser lorsque certains &eacute;v&egrave;nements se produisent au cours du       parsing du fichier XML.</p>       <p>La norme SAX (en version 2) d&eacute;finit ainsi quatre interfaces :</p>      <ul>       <li> <b>ContentHandler :</b> le parser appelle ses m&eacute;thodes pour        rendre compte des &eacute;v&egrave;nements relatifs au document. Elle d&eacute;finit ,        entre autre, les m&eacute;thodes suivantes :</li>       <ul>        <li> <tt>startDocument() :</tt> lorsqu'il ouvre un nouveau document        </li>        <li> <tt>startElement() :</tt> lorsqu'il rencontre un nouvel &eacute;l&eacute;ment        </li>        <li> <tt>characters() :</tt> lorsqu'il rencontre du texte</li>       </ul>        <li> <b>ErrorHandler :</b> ses m&eacute;thodes sont appel&eacute;es lorsque le        parser rencontre des warnings ou des erreurs. Elle permet par        cons&eacute;quent au d&eacute;veloppeur de d&eacute;cider de l'attitude &agrave; adopter        en cas d'erreur (arr&ecirc;ter le parsing ou non).</li>        <li> <b>DTDHandler :</b> ses m&eacute;thodes sont appel&eacute;es lors du        parsing de la DTD du document.</li>        <li> <b>EntityResolver :</b> son unique m&eacute;thode         <tt>resolveEntity()</tt> renvoie une URL pour une URI donn&eacute;e. Utile        pour la gestion des catalogues par exemple.</li>      </ul>       <p>SAX est tr&egrave;s rapide et peu gourmand en m&eacute;moire, mais il ne permet       pas de manipuler l'arbre du document lors du parsing (il ne fait        que <i>consommer</i> les donn&eacute;es). La norme permet d'&eacute;crire des       applications ind&eacute;pendantes du parser utilis&eacute; (en prenant quelques       pr&eacute;cautions d&eacute;crites plus loin dans ce document).</p>           <font color="#0090D0"> <h4> <a name="1.8.2">DOM</a> </h4> </font>      <ul>       <li>Standard du W3C : <a href="http://www.w3.org/TR/DOM-Level-2-Core/">http://www.w3.org/TR/DOM-Level-2-Core/</a>       </li>      </ul>       <p>DOM (Document Object Model) permet de repr&eacute;senter un document       XML sous forme d'un arbre d'objets en m&eacute;moire. Il d&eacute;finit       une API pour parcourir et modifier l'arborescence.</p>       <p>DOM est donc tout indiqu&eacute; pour des applications modifiant       l'arbre du document (comme un &eacute;diteur graphique de fichiers XML).      </p>       <p>Cependant, DOM soufre d'un certain nombre de d&eacute;fauts :</p>      <ul>       <li> <b>Il est lent :</b> &agrave; tel point que la plupart des         processeurs XSLT (qui pourtant seraient une application toute        indiqu&eacute;e du DOM) implantent leur propre mod&egrave;le objet en m&eacute;moire.</li>       <li> <b>Il est gourmand en m&eacute;moire :</b> chaque noeud (y compris        ceux d'attributs et de blancs) contient une r&eacute;f&eacute;rence vers le noeud        parent, suivant, pr&eacute;c&eacute;dent, premier et dernier fils, document        le contenant, son nom, sa valeur, donn&eacute;es utilisateur et quelques        drapeaux.</li>       <li> <b>La norme est incompl&egrave;te :</b> elle ne d&eacute;finit pas,        entre autre, comment on r&eacute;cup&egrave;re le document. Chaque parser implante        donc sa propre API. Il est par cons&eacute;quent impossible d'&eacute;crire du code        ind&eacute;pendant du parser utilis&eacute;. On est amen&eacute; &agrave; &eacute;crire des classes        "wrapper" implantant une interface commune pour chaque parser        support&eacute; (on pourra par exemple consulter le code source du        processeur XSLT XSL:P).</li>      </ul>            <font color="#0090D0"> <h4> <a name="1.8.3">Java API for XML Parsing</a> </h4> </font>       <ul>       <li> <a href="http://java.sun.com/aboutJava/communityprocess/final/jsr005/index.html">http://java.sun.com/aboutJava/communityprocess/final/jsr005/index.html</a> </li>      </ul>       <p>Sun a mis au point l'API pour le parsing XML afin de r&eacute;soudre les       probl&egrave;mes de d&eacute;pendance du code au parser &eacute;voqu&eacute;s ci-dessus.       Son API est une enveloppe pour rendre le code d'une application XML       ind&eacute;pendante du parser utilis&eacute;. Elle encapsule la cr&eacute;ation et le       param&eacute;trage des parsers SAX et DOM.</p>       <p>Par exemple, pour cr&eacute;er un parser SAX validant et implantant les       espaces de nommage, on utilisera le code suivant :</p>  <blockquote> <font color="#00A070"> <pre>   SAXParser parser;   HandlerBase handler = new MyHandlerBase();   SAXParserFactory factory = SAXParserFactory.newInstance();   factory.setNamespaceAware(true);   factory.setValidating(true);   try {     parser = factory.newSAXParser();     parser.parse("http://monserveur/mondocument.xml", handler);   } catch(SAXException se) {     // gestion des erreurs   } catch(IOException ioe) {     // gestion des erreurs   } catch(ParserConfigurationException pce) {     // gestion des erreurs   } </pre> </font> </blockquote>       <p>Ce code est totalement ind&eacute;pendant du parser utilis&eacute; et fonctionnera       avec tout parser conforme &agrave; l'API JAXP. JAXP d&eacute;finit aussi un m&eacute;canisme       semblable pour instancier et param&eacute;trer un parser DOM.</p>       <p>Le parser de Sun et les principaux parsers XML en Java implantent       cette API et il est tr&egrave;s probable que tous les autres fournisseurs       suivent cet exemple.</p>                 <font color="#0090D0"> <h2> <a name="2">Outils pour XML</a> </h2> </font>     <p>Je vous propose maintenant de faire un tour d'horizon des     <i>principaux</i> outils XML tournant sur plateforme Linux (pour     l'essentiel des outils Java). Un tel r&eacute;f&eacute;rencement ne peut pr&eacute;tendre &ecirc;tre     exhaustif car le nombre d'outils disponible est tr&egrave;s important et     augmente sans cesse. Pour des listes exhaustives et r&eacute;guli&egrave;rement     mises &agrave; jour, on pourra consulter la page      <a href="http://www.stud.ifi.uio.no/~lmariusg/linker/XMLtools.html">http://www.stud.ifi.uio.no/~lmariusg/linker/XMLtools.html</a> (concernant exclusivement les outils libres) ou     encore le site <a href="http://www.xml.com/resourceguide">http://www.xml.com/resourceguide</a>      qui recense aussi les outils propri&eacute;taires. D'autre part, l'article     <a href="http://www.xmltechno.com/outils/01_intro_p1.cfm">http://www.xmltechno.com/outils/01_intro_p1.cfm</a> recense les principaux     outils XML pour l'ensemble des langages de programmation et des     plateformes.</p>     <font color="#0090D0"> <h3> <a name="2.1">Le projet xml.apache.org</a> </h3> </font>     <ul>      <li> <a href="http://xml.apache.org">http://xml.apache.org</a> </li>      <li>Articles :        <a href="http://xml.apache.org/pr/0001.txt">http://xml.apache.org/pr/0001.txt</a> et        <a href="http://news.cnet.com/news/0-1003-200-1431504.html?tag=st.ne.1002.thed.1003-200-1431504">http://news.cnet.com/news/0-1003-200-1431504.html?tag=st.ne.1002.thed.1003-200-1431504</a>      </li>     </ul>     <p>Le projet <i>xml.apache.org</i> a pour objectif de fournir      des solutions XML de qualit&eacute; en Open Source, de faire suivre les      observations concernant les standards de l'IETF et du W3C et de      regrouper les activit&eacute;s relatives &agrave; XML du projet Apache. Il      regroupe de nombreuses entreprises actives dans le domaine (dont      IBM, Lotus, Sun, Exoffice et Bowstreet) et g&egrave;re les sous-projets      suivants :</p>      <ul>      <li>Xerces : Parsers XML en Java, C++ et Perl (anciennement XML4J        d'IBM)</li>      <li>Xalan : Processeurs de feuilles de style XSLT (anciennement        LotusXSL de Lotus)</li>      <li>Cocoon : Syst&egrave;me de publication sur le web bas&eacute; sur XML</li>      <li>FOP : Objets de formatage XSL</li>      <li>Xang: Serveur d'applications Web &eacute;crites en Java utilisant XML,       XSLT et ECMAScript (Java Script)</li>      <li>SOAP: (Simple Object Access Protocol) est une impl&eacute;mentation       <a href="http://www.w3.org/TR/SOAP">http://www.w3.org/TR/SOAP</a>        du W3 d'un protocole d'appel de m&eacute;thodes sur un objet distant       utilisant un protocole bas&eacute; sur XML.</li>      <li>Batik: est une boite &agrave; outil Java pour la visualisation, la        manipulation et la g&eacute;n&eacute;ration d'images SVG (Scalable Vector       Graphics).</li>      <li>Crimson: est le successeur du parser de Sun Project X. Il       devrait &agrave; terme fusionner avec Xerces pour devenir Xerces Java.</li>     </ul>      <p>Ce projet est une avanc&eacute;e majeure vers l'acceptation large des       logiciels Open Source. Il concr&eacute;tise l'engagement de grandes soci&eacute;t&eacute;s       informatiques sur la voie du logiciel libre.</p>      <p>Le d&eacute;veloppement de ces outils est       <a href="http://xml.apache.org/overview.html">http://xml.apache.org/overview.html</a>.       Xml.apache.org met &agrave; disposition des utilisateurs et d&eacute;veloppeurs des       <a href="http://xml.apache.org/mail.html">http://xml.apache.org/mail.html</a>.     </p>         <font color="#0090D0"> <h3> <a name="2.2">Parsers XML</a> </h3> </font>      <p>Un parser est un composant logiciel (classes Java en l'occurrence)       permettant d'acc&eacute;der simplement aux donn&eacute;es encapsul&eacute;es dans un fichier       XML. C'est donc le composant de base de toute application XML.</p>      <p>SAX permet de produire du code standard qui s'adapte, sans       recompilation, &agrave; tout parser moyennant quelques efforts. En particulier,      on prendra soin de ne pas instancier directement le parser, mais de      passer par la classe d&eacute;di&eacute;e (<tt>XMLReaderFactory</tt>). D'autre      part, il est utile de donner la possibilit&eacute; de param&eacute;trer le nom      de la classe du parser (sur la ligne de commande ou dans un fichier      de configuration).</p>      <p>JAXP (Java API for XML Parsing), API d&eacute;finie par Sun pour les      parsers XML en Java permet d'&eacute;crire du code ind&eacute;pendant du      parser utilis&eacute; pourvu qu'il soit conforme &agrave; l'API. C'est tr&egrave;s      utile pour instancier les parsers DOM dont le standard ne d&eacute;finit      que l'API pour la manipulation des documents et non pour obtenir      le parser lui m&ecirc;me, ce qui conduit &agrave; des codes fortement li&eacute;s      au parser utilis&eacute;. Un changement de parser en cours de projet      peut se r&eacute;v&eacute;ler alors douloureux.</p>      <p>Moyennant ces quelques pr&eacute;cautions, on pourra suivre le rythme       effr&eacute;n&eacute; du d&eacute;veloppement des parsers XML et en changer si n&eacute;cessaire.      Tous les parsers r&eacute;cents respectent l'API du Sun.</p>      <font color="#0090D0"> <h4> <a name="2.2.1">Project X de Sun</a> </h4> </font>      <ul>       <li> <a href="http://java.sun.com/xml">http://java.sun.com/xml</a>       </li>       <li>Gratuit</li>      </ul>       <p>Ce logiciel est gratuit (m&ecirc;me pour un usage commercial), et ses       sources en sont disponibles (dans le r&eacute;pertoire <i>src</i>).</p>       <p>Le parser de Sun est conforme &agrave; 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&eacute;rieure.</p>       <p>Sun met &agrave; notre disposition deux parsers : un parser non validant        <i>com.sun.xml.parser.Parser</i> (plus rapide) et un parser        validant <i>com.sun.xml.parser.ValidatingParser</i>. Le parser        non validant v&eacute;rifie que le document est <i>bien form&eacute;</i> alors        que le parser validant v&eacute;rifie en plus qu'il est conforme &agrave; sa DTD.</p>       <p>En plus des standards SAX et DOM, Sun fournit des classes &eacute;tendant        SAX pour implanter les <i>Namespaces</i>, mais aussi d'autres        classes utilitaires, comme le <i>TreeWalker</i> permettant de        naviguer ais&eacute;ment dans l'arbre du document.</p>       <p>Le parser de Sun d&eacute;livre des messages d'erreur particuli&egrave;rement        clairs. On notera cependant qu'il faut lui indiquer la <i>Locale</i>        <i>en_US</i> pour ne pas obtenir des messages d'erreur        incompr&eacute;hensibles.</p>       <p>Sans pr&eacute;ciser la <i>Locale</i>, on obtient par exemple :</p>       <blockquote> <font color="#00A070"> <pre>       com.sun.xml.parser/V-037 fixes      </pre> </font> </blockquote>       <p>En indiquant la <i>Locale</i>, on obtient :</p>       <blockquote> <font color="#00A070"> <pre>       Element "fixes" does not allow text.      </pre> </font> </blockquote>       <p>Ce qui est tout de m&ecirc;me plus clair ! Le probl&egrave;me vient du fait        que la m&eacute;thode d'initialisation du parser        (<i>com.sun.xml.Parser.init()</i>) choisit comme <i>Locale</i>        la <i>Locale</i> par d&eacute;faut de la VM (<i>fr_FR</i> pour une        VM sous nos latitudes) qui n'est pas support&eacute;e. On pourra indiquer        la <i>Locale</i> <i>en_US</i> avec le code suivant :</p>       <blockquote> <font color="#00A070"> <pre>       try {parser.setLocale(new Locale("en","US"));}       catch(Exception e){}      </pre> </font> </blockquote>       <p>On trouvera <a href="http://www.sweet-ohm.com/html/projectx.html">http://www.sweet-ohm.com/html/projectx.html</a> le code pour corriger ce bug ainsi       que la traduction des messages d'erreur en Fran&ccedil;ais.</p>       <p>La documentation du parser fournit de nombreux exemples        d'utilisation (dans le sous-r&eacute;pertoire <i>examples</i>).</p>       <p>Mis &agrave; part ce probl&egrave;me, ce parser m'a sembl&eacute; tr&egrave;s fiable &agrave;        l'utilisation.</p>       <p>Sun a donn&eacute; son parser au projet <i>xml.apache.org</i>, qui       devrait &agrave; terme le faire fusionner avec le parser d'IBM (voir l'       <a href="http://xml.apache.org/pr/0001.txt">http://xml.apache.org/pr/0001.txt</a> pour plus d'informations). Il sera bient&ocirc;t       disponible &agrave; l'URL suivante : <a href="http://xml.apache.org">http://xml.apache.org</a>.</p>           <font color="#0090D0"> <h4> <a name="2.2.2">Xerces-J (anciennement XML for Java) du projet xml.apache.org</a> </h4> </font>      <ul>       <li> <a href="http://xml.apache.org/xerces-j">http://xml.apache.org/xerces-j</a> ou <a href="http://www.alphaworks.ibm.com/aw.nsf/frame?ReadForm&amp;/aw.nsf/techmain/F62DB5F8684DCF6A8825671B00682F34">http://www.alphaworks.ibm.com/aw.nsf/frame?ReadForm&amp;/aw.nsf/techmain/F62DB5F8684DCF6A8825671B00682F34</a>       </li>       <li>Licence Apache 1.1 (pour les classes du paquet         <i>org.apache</i>) et IBM XML4J Evaluation Licence (pour les         classes du paquet <i>com.ibm</i>)</li>      </ul>       <p>Xerces-J est le nom du projet XML4J depuis qu'IBM en a fait        don &agrave; <i>xml.apache.org</i>. Il est maintenant g&eacute;r&eacute; par ce        dernier mais IBM continue de distribuer une version sur son site        <a href="http://alphaworks.ibm.com/formula">http://alphaworks.ibm.com/formula</a>.        La version 3 de XML4J est bas&eacute;e sur le code de Xerces-J mais XML4J        fournit en plus une API de compatibilit&eacute; avec les versions 2        (contenue dans le fichier <tt>xml4j.jar</tt>).</p>       <p>Xerces-J est distribu&eacute; sous forme de binaires (fichier JAR) et        sous forme de sources.</p>       <p>Xerces-J supporte <i>SAX</i> versions 1 et 2, <i>DOM</i>        versions 1 et 2, ainsi que <i>XML Schema</i>. Le support de        Schema, SAX 2 et DOM 2 est encore en d&eacute;veloppement. Il impl&eacute;mente        d'autre part l'API JAXP de Sun pour les parsers XML.</p>       <p>Xerces-J propose deux parsers :        <i>org.apache.xerces.parsers.SAXParser</i> et        <i>org.apache.xerces.parsers.DOMParser</i>. Il est possible de        leur passer des <i>propri&eacute;t&eacute;s</i> ou des <i>fonctionnalit&eacute;s</i>        &agrave; l'aide de l'interface <i>org.xml.sax.Configurable</i> de SAX2.        Par exemple, pour que le parser soit validant, on pourra &eacute;crire :</p>       <blockquote> <font color="#00A070"> <pre>       SAXParser p=new SAXParser();       try {         p.setFeature("http://xml.org/sax/features/validation",true);       } catch (SAXException e) {         System.out.println("error in setting up parser feature");       }      </pre> </font> </blockquote>       <p>Xerces-J g&egrave;re les catalogues au format <a href="http://www.ccil.org/~cowan/XML/XCatalog.html">http://www.ccil.org/~cowan/XML/XCatalog.html</a>        (version 0.2) d&eacute;riv&eacute; du format de catalogue        <i>SGML Open catalog format</i>. Cette fonctionnalit&eacute; me        semble quasiment indispensable pour g&eacute;rer les DTDs. Pour plus        de d&eacute;tails, voir les fichiers        <i>org.apache.xerces.readers.XCatalog.java</i> et        <i>org.apache.xerces.readers.XMLCatalog.java</i> des sources.</p>       <p>Des exemples sont disponibles dans le sous-r&eacute;pertoire        <i>samples</i>.</p>       <p>Ce parser (dans ses versions 1 et 2) m'a donn&eacute; enti&egrave;re        satisfaction, mais on peut lui reprocher ses messages d'erreur        pas toujours tr&egrave;s clairs.</p>           <font color="#0090D0"> <h4> <a name="2.2.3">OpenXML</a> </h4> </font>      <ul>       <li> <a href="http://www.openxml.org">http://www.openxml.org</a> </li>       <li> <a href="http://www.openxml.org/license.html">http://www.openxml.org/license.html</a>       </li>      </ul>       <p>OpenXML (de Exoffice et Assaf Arkin) a longtemps &eacute;t&eacute; le seul        parser XML en Open Source. Il a rejoint le projet        <i>xml.apache.org</i>, mais n'est pas encore disponible sur        le site Apache.</p>       <p>Il supporte XML 1.0, SAX et DOM level 1, ainsi que les catalogues        au format XCatalog (version 0.3) et XML Software Autoupdate.</p>            <font color="#0090D0"> <h4> <a name="2.2.4">Aelfred</a> </h4> </font>      <ul>       <li> <a href="http://www.opentext.com/services/content_management_services/xml_sgml_solutions.html#aelfred_and_sax">http://www.opentext.com/services/content_management_services/xml_sgml_solutions.html#aelfred_and_sax</a> </li>       <li>Gratuit</li>      </ul>       <p>&AElig;lfred est un analyseur tr&egrave;s petit (le fichier Jar ne fait que       22 ko), ce qui le rend tr&egrave;s int&eacute;ressant pour un usage dans       les applets par exemple. De plus, son occupation m&eacute;moire est        tr&egrave;s faible.</p>                <font color="#0090D0"> <h4> <a name="2.2.5">Choix d'un parser</a> </h4> </font>            <p>Le parser &eacute;tant la pi&egrave;ce ma&icirc;tresse d'une application XML, faire        le bon choix est primordial. On peut trouver des benchmarks testant        les principaux parsers disponibles :</p>       <ul>       <li> <a href="http://developerlife.com/domconformance/default.htm">http://developerlife.com/domconformance/default.htm</a> : teste la conformit&eacute; des parsers aux         standards</li>       <li> <a href="http://developerlife.com/parsertest2/performance.html">http://developerlife.com/parsertest2/performance.html</a> : compare les performances des trois         parsers Java principaux (Xerces, ProjectX et OpenXML)</li>       <li> <a href="http://www.xml.com/lpt/a/Benchmark/exec.html">http://www.xml.com/lpt/a/Benchmark/exec.html</a> : teste les performances des parsers dans diff&eacute;rents langages         (C, Java, Perl et Python).</li>      </ul>       <p> <i>D'apr&egrave;s ces benchmarks</i> il semblerait que :</p>      <ul>       <li>Xerces-J soit le plus rapide</li>       <li>ProjectX soit plus respectueux des standards</li>      </ul>       <p> <b>Cependant</b>, ces tests commencent &agrave; dater et j'accorde        personnellement peu de cr&eacute;dit aux benchmarks en g&eacute;n&eacute;ral.       Il ressort de mon <b>exp&eacute;rience personnelle</b> (ayant utilis&eacute;        de mani&egrave;re intensive XML4J en versions 1 et 2 et ProjectX) que :</p>      <ul>       <li>XML4J est plus rapide sur des machines virtuelles 1.1 alors         que ProjectX est plus rapide sur 1.2.</li>       <li>Les messages d'erreur de ProjectX sont plus clairs.</li>      </ul>       <p>En outre, en produisant du code conforme aux standards, il est        possible de changer de parser de mani&egrave;re simple. La meilleure solution        me semble donc &ecirc;tre de tester soi-m&ecirc;me les parsers dans l'application.      </p>                <font color="#0090D0"> <h3> <a name="2.3">Processeurs XSLT</a> </h3> </font>      <p>Les processeurs XSL transforment un fichier XML en un fichier d'un       autre format (html, texte ou LaTeX par exemple) &agrave; l'aide de feuilles       de style XSL. Ils peuvent donc &ecirc;tre invoqu&eacute;s sur la ligne de commande       de la mani&egrave;re suivante :</p>      <blockquote> <font color="#00A070"> <pre>      java classe.du.processeur fichier.xml fichier.xsl fichier.???     </pre> </font> </blockquote>      <p>Lorsqu'on utilise ces programmes pour traiter de petits fichiers sur       la ligne de commande, il peut &ecirc;tre utile (pour une question de vitesse       d'ex&eacute;cution) de d&eacute;sactiver le compilateur JIT en ajoutant la ligne       suivante dans le script de lancement :</p>      <blockquote> <font color="#00A070"> <pre>      export JAVA_COMPILER=     </pre> </font> </blockquote>      <p>Il est possible d'int&eacute;grer ces programmes dans une application.       Il n'existe pas d'API commune &agrave; ces processeurs, mais tous utilisent       un parser SAX ou DOM pour construire une repr&eacute;sentation en m&eacute;moire       du document. Le document &agrave; traiter pourra alors &ecirc;tre communiqu&eacute; au       programme sous forme d'un DOM ou d'une <tt>InputSource</tt> SAX.</p>      <font color="#0090D0"> <h4> <a name="2.3.1">XT de James Clark</a> </h4> </font>      <ul>       <li> <a href="http://www.jclark.com/xml/xt.html">http://www.jclark.com/xml/xt.html</a> </li>       <li>Licence de type Apache</li>      </ul>       <p>Ce programme est sous licence de type <i>Open Source</i> et        donc livr&eacute; avec celles-ci. Cependant, l'absence totale de commentaires        rend le code assez imperm&eacute;able &agrave; toute modification ou am&eacute;lioration.</p>       <p>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&eacute;t&eacute; syst&egrave;me, <tt>-Dorg.xml.sax.parser=le.nom.du.parser</tt>).</p>       <p>Il est possible de passer des arguments sur la ligne de commande        (sous la forme <i>nom=valeur</i>). Ces arguments, de type cha&icirc;ne        de caract&egrave;res, peuvent alors &ecirc;tre utilis&eacute;s dans le fichier XSL s'il        d&eacute;finit le param&egrave;tre correspondant.</p>       <p>XT peut &ecirc;tre utilis&eacute; comme Servlet (avec un moteur de Servlet de        version 2.1 ou sup&eacute;rieur), la classe correspondante est        <tt>com.jclark.xsl.sax.XSLServlet</tt>.</p>       <p>XT d&eacute;finit une API bas&eacute;e sur SAX (interface        <tt>com.jclark.xsl.sax.XSLProcessor</tt>) et une API bas&eacute;e sur DOM        (interface <tt>com.jclark.xsl.dom.TransformEngine</tt>). Cependant,        la classe DOM est bien plus lente et moins fonctionnelle que celle        bas&eacute;e sur SAX mais indispensable lorsque le document &agrave; traiter r&eacute;sulte        de la manipulation d'un document DOM en m&eacute;moire. Il est m&ecirc;me possible        de m&eacute;langer ces deux m&eacute;thodes.</p>       <p>XT comporte quelques extensions par rapport &agrave; la norme, parmi        lesquelles :</p>      <ul>       <li> <b>Appel de m&eacute;thodes</b> Java. On pourra par exemple &eacute;crire         le code suivant dans un fichier XSL pour afficher la date :</li>      </ul>      <blockquote> <font color="#00A070"> <pre>     &lt;xsl:stylesheet     version="1.0"     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"     xmlns:date="http://www.jclark.com/xt/java/java.util.Date"&gt;      &lt;xsl:template match="/"&gt;     &lt;html&gt;     &lt;xsl:if test="function-available('date:to-string') and      function-available('date:new')"&gt;     &lt;p&gt;&lt;xsl:value-of select="date:to-string(date:new())"/&gt;&lt;/p&gt;     &lt;/xsl:if&gt;     &lt;/html&gt;     &lt;/xsl:template&gt;      &lt;/xsl:stylesheet&gt;      </pre> </font> </blockquote>      <ul>       <li> <b>Documents multiples</b> : le fragment de document encadr&eacute;         par l'&eacute;l&eacute;ment <tt>&lt;xt:document href="chemin-fichier"&gt;</tt> sera         enregistr&eacute; dans le fichier dont le chemin relatif (par rapport au         document g&eacute;n&eacute;r&eacute;) est donn&eacute; par l'attribut <tt>href</tt>. Par exemple,         le source suivant g&eacute;n&egrave;re (en plus du document normalement g&eacute;n&eacute;r&eacute; par         le traitement du fichier XML en cours) deux fichiers :         <i>hello.xml</i> (contenant la cha&icirc;ne <i>Hello !</i>) et         <i>world.xml</i> (contenant le cha&icirc;ne &agrave; laquelle vous pensez).         Le r&eacute;pertoire <i>demo</i> contient des exemples plus pertinents         de documents multifichiers.</li>      </ul>      <blockquote> <font color="#00A070"> <pre>     &lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"     xmlns:xt="http://www.jclark.com/xt"     extension-element-prefixes="xt"&gt;      &lt;xsl:template match="/"&gt;     &lt;xt:document method="xml" href="hello.xml"&gt;     Hello !     &lt;/xt:document&gt;     &lt;xt:document method="xml" href="world.xml"&gt;     World !     &lt;/xt:document&gt;     &lt;/xsl:template&gt;      &lt;/xsl:stylesheet&gt;      </pre> </font> </blockquote>      <ul>       <li> <b>M&eacute;thode de sortie additionnelle :</b> permet de rajouter         un caract&egrave;re d'&eacute;chappement devant certains caract&egrave;res.</li>       <li> <b>Fonctions additionnelles :</b> ajoute trois fonctions &agrave;         celles du standard : <i>xt:node-set</i> (pour convertir un fragment         d'arbre en <i>node-set</i>), <i>xt:intersection</i> (renvoie         l'intersection de deux <i>node-sets</i>) et <i>xt:difference</i>         (renvoie la diff&eacute;rence de deux <i>node-sets</i>).</li>      </ul>       <p>Ces extensions &agrave; la norme s'av&egrave;rent &ecirc;tre tr&egrave;s utiles (en particulier        les deux premi&egrave;res) et l'on peut s'attendre &agrave; ce qu'elles soient un        jour ajout&eacute;es au standard (dans la mesure o&ugrave; James Clark est partie        prenante dans la d&eacute;finition de ces standards du W3C). Cependant, comme        toute extension, elles interdisent toute migration vers un autre        processeur XSL.</p>       <p>Malgr&eacute; quelques limitations (fonctionnalit&eacute;s de la proposition XSLT        1.0 non implant&eacute;es) et quelques bugs connus, ce programme est tr&egrave;s        fonctionnel, respectueux des standards et rapide. On regrettera       cependant le manque de messages d'erreur qui rend le d&eacute;buggage       de fichiers XSL p&eacute;nible et l'absence de commentaires dans les        sources.</p>       <p>Contre toute attente, son auteur James Clark, en a arr&ecirc;t&eacute; le       d&eacute;veloppement car son impl&eacute;mentation n'avait pour but que de       tester la recommandation du W3 (dont il est l'&eacute;diteur). Des       utilisateurs de XT ont cependant mis en place un site de       <a href="http://4xt.org">http://4xt.org</a>.</p>            <font color="#0090D0"> <h4> <a name="2.3.2">Xalan-Java (anciennement LotusXSL) du projet xml.apache.org</a> </h4> </font>      <ul>       <li> <a href="http://xml.apache.org/xalan">http://xml.apache.org/xalan</a> </li>       <li> <a href="http://xml.apache.org/dist/LICENSE.txt">http://xml.apache.org/dist/LICENSE.txt</a> </li>      </ul>       <p>Xalan fait maintenant partie du projet <i>xml.apache.org</i>. Une        version C++ est aussi disponible.</p>       <p>Par d&eacute;faut, Xalan est configur&eacute; pour fonctionner avec Xerces, mais il        peut s'accommoder de tout parser DOM.</p>       <p>Xalan peut produire des &eacute;v&eacute;nements SAX, un DOM ou un document XML.</p>       <p>Les feuilles de style sont lues par un parser SAX puis compil&eacute;es (les        expressions XPath et les traitements qui peuvent l'&ecirc;tre sans conna&icirc;tre        la structure du document XML &agrave; traiter).</p>       <p>Il est n&eacute;cessaire de cr&eacute;er une instance de Xalan par thread (deux        threads ne peuvent partager la m&ecirc;me instance). C'est certainement peu        g&ecirc;nant pour la plupart des utilisations, mais je me demande si ce ne        serait pas un probl&egrave;me pour les <i>Servlets</i> (on ne peut alors        utiliser une m&ecirc;me instance pour toutes les requ&ecirc;tes).</p>       <p>Xalan permet de g&eacute;n&eacute;rer plusieurs fichiers &agrave; partir d'un unique        fichier XSL lorsque la m&eacute;thode de sortie est <i>html</i>, <i>xml</i>       ou <i>text</i>.</p>       <p>Xalan permet d'appeler une m&eacute;thode Java ou JavaScript dans un script        XSL.</p>       <p>Le point fort de Xalan est le d&eacute;buggage des fichiers XSL :</p>      <ul>       <li>On peut tracer les <i>templates</i> en cours de g&eacute;n&eacute;ration.       </li>       <li>Une DTD est fournie pour les sorties de type <i>html</i>.</li>      </ul>       <p>Il est possible d'utiliser Xalan de trois mani&egrave;res distinctes :</p>      <ul>       <li> <b>Sur la ligne de commande :</b> en lan&ccedil;ant la classe         <tt>org.apache.xalan.xslt.Process</tt> et en lui passant le fichier         XML, le fichier XSL et le fichier de sortie. La liste des options de         la ligne de commande est tr&egrave;s compl&egrave;te : on peut valider les fichiers         XML et XSL, on peut passer des arguments &agrave; la feuille de style, etc.       </li>       <li> <b>Depuis une autre classe Java :</b> les fichiers XML et XSL         peuvent &ecirc;tre pass&eacute;s sous forme d'<i>URL</i>, de fichier, de flux de         caract&egrave;res ou de document DOM. La feuille de style peut &ecirc;tre pass&eacute;e         sous forme compil&eacute;e. Xalan utilise des <i>wrappers</i> pour combler         des lacunes de DOM concernant l'interface des parsers (le code est         ainsi ind&eacute;pendant du parser DOM utilis&eacute;). La documentation fournit un         exemple de programme utilisant Xalan.</li>       <li> <b>Dans une applet :</b> permet ainsi d'embarquer le processeur         XSL dans une applet et de r&eacute;cup&eacute;rer le document de sortie sous forme         d'une cha&icirc;ne de caract&egrave;res.</li>      </ul>       <p>Pour finir, Xalan fournit une interface de d&eacute;buggage.</p>            <font color="#0090D0"> <h4> <a name="2.3.3">Saxon</a> </h4> </font>       <ul>       <li> <a href="http://users.iclway.co.uk/mhkay/saxon">http://users.iclway.co.uk/mhkay/saxon</a> </li>       <li> <a href="http://www.mozilla.org/MPL/">http://www.mozilla.org/MPL/</a> </li>      </ul>       <p>Saxon 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&egrave;que Java rendant un service comparable &agrave;       XSLT mais avec la possibilit&eacute; de programmer - ce qui permet par        exemple d'acc&eacute;der &agrave; une base de donn&eacute;es. Il utilise une version        modifi&eacute;e de &AElig;lfred (passant les commentaires &agrave; l'application), mais       tout analyseur SAX 2 fait l'affaire.</p>       <p>Le processeur XSLT de Saxon permet de g&eacute;n&eacute;rer plusieurs documents       &agrave; partir d'un seul fichier XML, de cha&icirc;ner les feuilles de style &agrave;       appliquer au document XML et de modifier les variables d'une feuille       de style (qui ne peuvent normalement pas &ecirc;tre modifi&eacute;es, contrairement       &agrave; ce que laisse supposer leur nom).</p>            <font color="#0090D0"> <h4> <a name="2.3.4">XSL:P de Keith Visco</a> </h4> </font>      <ul>       <li> <a href="http://www.clc-marketing.com/xslp/">http://www.clc-marketing.com/xslp/</a> </li>       <li> <a href="http://www.clc-marketing.com/xslp/download.html">http://www.clc-marketing.com/xslp/download.html</a> </li>      </ul>       <p>XSL:P fait maintenant partie du projet <i>xml.apache.org</i>. Il        n'implante que le <i>draft</i> du 21.4.1999. (et n'est donc pas &agrave;        jour par rapport au standard). Une version C++ est en d&eacute;veloppement        (elle est pr&eacute;sente sur le <a href="http://lxr.mozilla.org/seamonkey/source/extensions/transformiix">http://lxr.mozilla.org/seamonkey/source/extensions/transformiix</a>).</p>       <p>XSL:P peut utiliser XML4j versions 1.1.16 ou 2.0.x, OpenXML,        Oracle XML Parser ou ProjectX. Il est configur&eacute; par d&eacute;faut pour utiliser        XML4J, mais on peut changer de parser en &eacute;ditant le fichier        <i>xslp.properties</i> dans le fichier JAR.</p>       <p>L'originalit&eacute; de XSL:P est de disposer de <i>formatters</i>        permettant des formats de sortie divers.</p>       <p>XSL:P soufre d'un probl&egrave;me de lenteur du &agrave; l'utilisation de DOM comme        format de repr&eacute;sentation en m&eacute;moire des documents.</p>       <p>L'auteur semble envisager de fusionner XSL:P dans Xalan.</p>               <font color="#0090D0"> <h3> <a name="2.4">&Eacute;diteurs XML</a> </h3> </font>      <p>Il est possible d'&eacute;diter un document XML avec tout &eacute;diteur de texte.       Cependant, il peut &ecirc;tre utile de disposer d'un outil permettant de       valider les documents, de conna&icirc;tre les &eacute;l&eacute;ments autoris&eacute;s, etc.</p>      <font color="#0090D0"> <h4> <a name="2.4.1">Emacs et PSGML</a> </h4> </font>      <ul>       <li> <a href="http://www.emacs.org">http://www.emacs.org</a> et <a href="http://www.lysator.liu.se/projects/about_psgml.html">http://www.lysator.liu.se/projects/about_psgml.html</a> </li>       <li>Licence <a href="http://www.gnu.org/copyleft/gpl.html">http://www.gnu.org/copyleft/gpl.html</a> </li>      </ul>       <p>On ne pr&eacute;sente plus Emacs, l'&eacute;diteur surpuissant. On peut       quasiment tout faire avec (lire son courrier, les forums, &eacute;diter       du code Java, ou m&ecirc;me des fichiers XML, comme je suis en train       de le faire en ce moment m&ecirc;me).</p>       <p>Emacs poss&egrave;de par d&eacute;faut un mode SGML adapt&eacute; &agrave; XML, mais ce       mode est assez limit&eacute;. Pour un usage intensif, on lui pr&eacute;f&eacute;rera       <i>PSGML</i>, mode permettant d'&eacute;diter des fichiers SGML et       (depuis sa version 1.2.0) des fichiers XML.</p>       <p>On peut trouver une documentation, en fran&ccedil;ais, sur l'installation        de <i>PSGML</i> &agrave; l'adresse <a href="http://www.linux-france.org/article/appli/emacs/psgml-linuxdoc/sgml-tools-1/">http://www.linux-france.org/article/appli/emacs/psgml-linuxdoc/sgml-tools-1/</a> (Attention ! cette        documentation n'est plus &agrave; jour mais reste utile). La documentation du       programme est assez compl&egrave;te, mais on peut trouver un livre complet       sur l'utilisation de <i>PSGML</i> &agrave; l'adresse <a href="http://www.snee.com/bob/sgmlfree">http://www.snee.com/bob/sgmlfree</a>.</p>       <p>On notera qu'il est n&eacute;cessaire de taper <tt>M-X xml-mode</tt> pour       &eacute;diter un fichier XML (sans quoi on l'&eacute;dite en mode SGML, ce qui peut       poser des probl&egrave;mes). Il est aussi possible d'ajouter le commentaire       suivant en fin de fichier pour passer au mode XML lors du chargement       du fichier :</p>  <blockquote> <font color="#00A070"> <pre>  &lt;!--   Local Variables:     mode: xml     sgml-indent-data: t     sgml-indent-step: 1   End:   --&gt;</pre> </font> </blockquote>                 <font color="#0090D0"> <h4> <a name="2.4.2">XED</a> </h4> </font>      <ul>       <li>        <a href="ftp://ftp.cogsci.ed.ac.uk/pub/ht/xed05-freebsd.tar.gz">ftp://ftp.cogsci.ed.ac.uk/pub/ht/xed05-freebsd.tar.gz</a>       </li>       <li>Pour &eacute;valuation seulement</li>      </ul>       <p>XED est un &eacute;diteur validant (il lit les DTDs) cod&eacute; en C,       Python et Tk. Il facilite l'&eacute;dition des fichiers XML (messages       d'erreur, possibilit&eacute; d'enlever les instructions et les       commentaires, menu contextuel pour les &eacute;l&eacute;ments et attributs,       etc.).</p>       <p>La principale limitation de XED vient de l'utilisation de Python       qui ne supporte pas l'UNICODE.</p>           <font color="#0090D0"> <h4> <a name="2.4.3">Morphon XML Editor</a> </h4> </font>      <ul>       <li> <a href="http://www.morphon.com">http://www.morphon.com</a>       </li>       <li>Gratuit</li>      </ul>       <p>XMLEditor est un &eacute;diteur XML &eacute;crit en Java. Il permet d'&eacute;diter        graphiquement un fichier XML (avec une vue de l'arbre et une vue       WYSIWYG). On peut aussi voir le r&eacute;sultat de la page HTML g&eacute;n&eacute;r&eacute;e.</p>       <p>La version test&eacute;e utilisait pour le formatage un langage qui &eacute;tait       une <i>extension</i> du standard XSL (appel&eacute; <i>EXSL</i>). La        version actuelle utilise <i>CSS</i> et fournit un &eacute;diteur ad&eacute;quat.       On peut cependant se demander si le choix de XSLT n'aurait pas &eacute;t&eacute;       plus judicieux.</p>           <font color="#0090D0"> <h4> <a name="2.4.4">XML Pro</a> </h4> </font>      <ul>       <li> <a href="http://www.vervet.com">http://www.vervet.com</a> </li>       <li>Commercial (version d'&eacute;valuation disponible)</li>      </ul>       <p>XML Pro est un &eacute;diteur XML commercial &eacute;crit en Java. Il pr&eacute;sente       une vue de l'arborescence du fichier dans laquelle il est possible       d'ins&eacute;rer un &eacute;l&eacute;ment, d'en supprimer, etc. Une VM 1.2 est n&eacute;cessaire.</p>       <p>Si la r&eacute;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&amp;F Windows !</p>       <p>L'archive ne fournissant ni documentation, ni script de lancement       (m&ecirc;me pour Windows), on est bien embarrass&eacute; &agrave; l'installation du       produit (on ne conna&icirc;t pas la classe Java &agrave; invoquer !). Voici un        script de lancement pour syst&egrave;me UNIX :</p>       <blockquote> <font color="#00A070"> <pre>     #!/bin/sh     XMLPRO_HOME=/usr/local/xmlpro     export CLASSPATH=$XMLPRO_HOME/xmlpro.jar     cd $XMLPRO_HOME     java XMLPro      </pre> </font> </blockquote>               <font color="#0090D0"> <h3> <a name="2.5">Navigateurs et serveurs XML</a> </h3> </font>      <p>Un navigateur XML permet de visualiser un fichier XML associ&eacute; &agrave; une      feuille de style (XSL, CSS ou autre). C'est un outil essentiel pour      l'utilisation de XML &agrave; grande &eacute;chelle sur l'internet et pourtant,      les navigateurs XML op&eacute;rationnels ne sont pas l&eacute;gion.</p>      <font color="#0090D0"> <h4> <a name="2.5.1">InDelv XML Browser</a> </h4> </font>      <ul>       <li> <a href="http://www.indelv.com">http://www.indelv.com</a> </li>       <li>Gratuit</li>      </ul>       <p>La version de test de ce produit comporte un &eacute;diteur en version       limit&eacute;e dans le temps et un navigateur XML/XSL gratuit.</p>       <p>L'ensemble est int&eacute;ressant et plut&ocirc;t stable. Le choix d'AWT peut        &ecirc;tre critiqu&eacute;, mais il donne au programme une vitesse d'ex&eacute;cution       tr&egrave;s satisfaisante.</p>       <p>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 <i>tous</i>       mis en forme avec la m&ecirc;me feuille de style XSL <i>sp&eacute;cifique</i> aux        oeuvres de l'auteur.</p>       <p>Si le concept est tr&egrave;s int&eacute;ressant, le rendu graphique (et en        particulier les polices) laissent un peu &agrave; d&eacute;sirer et on est encore       loin du rendu d'un navigateur HTML comme Netscape.</p>           <font color="#0090D0"> <h4> <a name="2.5.2">Amaya</a> </h4> </font>      <ul>       <li> <a href="http://www.w3.org/Amaya">http://www.w3.org/Amaya</a> </li>       <li> <a href="http://www.w3.org/Consortium/Legal/copyright-software-19980720.html">http://www.w3.org/Consortium/Legal/copyright-software-19980720.html</a> </li>      </ul>       <p>Amaya est le navigateur du W3C et permet de tester les nouveaux       protocoles et formats de donn&eacute;es. Il est disponible pour Windows et       pour UNIX (un fichier RPM est disponible au t&eacute;l&eacute;chargement). Amaya       comporte de plus un &eacute;diteur HTML/XHTML/MathML WYSIWYG g&eacute;rant les       feuilles de style CSS.</p>       <p>En ce qui concerne XML, Amaya est capable d'afficher et d'&eacute;diter le       XHTML et MathML. On peut en voir une d&eacute;monstration sur        <a href="http://www.w3.org/Amaya/MathExamples.html">http://www.w3.org/Amaya/MathExamples.html</a>       (mais il faut un navigateur capable d'afficher le MathML pour en        profiter !).</p>       <p>L'affichage des graphiques vectoriels XML SVG (Scalable Vector        Graphics) est pr&eacute;vu pour une prochaine version.</p>           <font color="#0090D0"> <h4> <a name="2.5.3">Cocoon</a> </h4> </font>       <ul>       <li> <a href="http://xml.apache.org/cocoon">http://xml.apache.org/cocoon</a> </li>       <li> <a href="http://xml.apache.org/cocoon/license.html">http://xml.apache.org/cocoon/license.html</a>       </li>      </ul>       <p>Cocoon est une extension pour g&eacute;rer le XML c&ocirc;t&eacute; serveur.       In n&eacute;cessite un serveur HTTP muni d'un moteur de servlets       (comme JServ ou Tomcat). Il permet :</p>       <ul>       <li>G&eacute;n&eacute;rer du HTML, XHTML, WML ou PDF &agrave; partir de fichiers        XML.</li>       <li>De servir du XML &agrave; des clients capables de l'afficher        (lorsqu'on lui fournit une feuille de style ad&eacute;quate).</li>       <li>D'appliquer des feuilles de style en cascade.</li>       <li>De changer la feuille de style en fonction du client.</li>      </ul>        <p>Le but de Cocoon est de s&eacute;parer la <i>cr&eacute;ation</i>, le        <i>traitement</i> et la <i>pr&eacute;sentation</i> du contenu XML        d'un site, qui correspondent &agrave; des m&eacute;tiers distincts. En effet,       le contenu des pages se trouve dans les fichiers XML, le       traitement dans des balises XSP (jeu de balises associ&eacute;es &agrave;       des traitements) et la pr&eacute;sentation dans des feuilles de style       XSL.</p>       <p>Les cr&eacute;ateurs de Cocoon voient un certain nombre de limitations       &agrave; son utilisation :</p>       <ul>       <li>Le langage de feuilles de style XSL est encore m&eacute;connu,        mais cela devrait changer dans un futur proche.</li>       <li>Les traitements mis en jeu lors du formatage XSL sont        lourds et consomment donc des ressources importantes c&ocirc;t&eacute;        serveur. La r&eacute;solution de ce probl&egrave;me passe par l'utilisation        de navigateurs XML/XSL qui d&eacute;porteront le traitement c&ocirc;t&eacute;        client (c'est d&eacute;j&agrave; le cas avec IE5).</li>      </ul>                   <font color="#0090D0"> <h2> <a name="3">Exemples de mise en oeuvre</a> </h2> </font>     <p>Pour conclure cet expos&eacute;, je vous propose l'&eacute;tude d'exemples de     mise en oeuvre de XML dans divers domaines d'application.</p>     <font color="#0090D0"> <h3> <a name="3.1">G&eacute;n&eacute;ration de pages</a> </h3> </font>      <font color="#0090D0"> <h4> <a name="3.1.1">WAP SDK In-Fusio</a> </h4> </font>       <p> <a href="http://www.in-fusio.com">http://www.in-fusio.com</a> est une        soci&eacute;t&eacute; Bordelaise proposant des services de       jeu sur t&eacute;l&eacute;phone mobile. Elle d&eacute;veloppe entre autre des jeux       WAP reposant sur PHP. Pour acc&eacute;l&eacute;rer le d&eacute;veloppement de tels       jeux (qui comportent tous une proc&eacute;dure d'identification, de       gestion des scores, etc.) In-Fusio a d&eacute;velopp&eacute; la plateforme       serveur GameZilla qui offre ces services.</p>       <p>Le WAP SDK permet aux d&eacute;veloppeurs de jeux d'acc&eacute;der aux services       de GameZilla mais aussi de rendre le code du jeu ind&eacute;pendant de       la plateforme cible. En particulier, le WML des pages doit &ecirc;tre       adapt&eacute; aux deux principaux navigateurs WML que l'on trouve sur       les t&eacute;l&eacute;phones mobiles (Nokia et Phone.com) et traduites suivant       la langue de l'utilisateur.</p>            <p>Il est bien s&ucirc;r possible de le faire dynamiquement en PHP mais       cela imbrique la pr&eacute;sentation et la logique du jeu (les templates        pour les diff&eacute;rentes versions du WML sont noy&eacute;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&eacute;es, ce qui peut impliquer plusieurs requ&ecirc;tes par page).</p>       <p>&Agrave; cette approche dynamique, nous avons pr&eacute;f&eacute;r&eacute; une approche       statique:</p>       <ul>       <li>Le code PHP est clairement s&eacute;par&eacute; du WML (s&eacute;paration de la        logique de jeu et de la pr&eacute;sentation).</li>       <li>On applique une premi&egrave;re feuille de style aux sources        pour adapter le WML au navigateur du client.</li>       <li>Une deuxi&egrave;me feuille de style traduit les r&eacute;f&eacute;rences        aux messages (de la forme <tt>@{reference}</tt> en messages        dans la langue du client.</li>      </ul>       <p>Le programme de jeu doit &ecirc;tre accompagn&eacute; d'un fichier XML       contenant la traduction des messages et les noms des fichiers       des images suivant leur taille (fichier de <i>ressources</i>).       Il doit &ecirc;tre aussi accompagn&eacute; d'un descripteur indiquant les       configurations support&eacute;es (navigateurs, langues et tailles       d'images).</p>       <p>Lors de la compilation, le compilateur du SDK g&eacute;n&egrave;re N       r&eacute;pertoires comportant les fichiers compil&eacute;s. Un r&eacute;pertoire       correspond &agrave; une configuration possible (par exemple, navigateur       Nokia, fran&ccedil;ais et grandes images).</p>       <p>Prenons le cas d'une page d'accueil d'un jeu:</p>        <blockquote> <font color="#00A070"> <pre>  &lt;?xml version="1.0"?&gt;    &lt;?php   // reset fields   $solution="";   session_register("solution");   $nb_attempts=0;   session_register("nb_attempts");   ?&gt;    &lt;wml&gt;    &lt;head&gt;     &lt;meta http-equiv="Expires" content="Thu, 01 Dec 1994 16:00:00 GMT"/&gt;     &lt;meta http-equiv="Cache-Control" content="no-cache, max-age=0"/&gt;    &lt;/head&gt;       &lt;card id="menu" title="@{title}"&gt;     &lt;p align="center"&gt;&lt;img src="@{logo}" alt="@{title}"/&gt;&lt;/p&gt;     &lt;menu&gt;      &lt;item href="play.php"&gt;@{play}&lt;/item&gt;      &lt;item href="rules.php"&gt;@{rules-title}&lt;/item&gt;      &lt;item href="ranking.php"&gt;@{ranking}&lt;/item&gt;     &lt;/menu&gt;     &lt;quit&gt;@{quit}&lt;/quit&gt;    &lt;/card&gt;   &lt;/wml&gt;</pre> </font> </blockquote>       <p>Cette page comporte les particularit&eacute;s suivantes:</p>       <ul>       <li>Les guidelines du SDK imposent une s&eacute;paration claire        du code PHP et du WML.</li>       <li>On remarque le pr&eacute;sence de r&eacute;f&eacute;rences du type <tt>@{nom}</tt>.        Ce sont des r&eacute;f&eacute;rences &agrave; des ressources dont la valeur d&eacute;pend de        la configuration.</li>       <li>Certains &eacute;l&eacute;ments de la partie WML ne font pas partie        de la norme. Ce sont des &eacute;l&eacute;ments propres au SDK In-Fusio qui        seront ensuite transform&eacute;s suivant le navigateur cibl&eacute;. C'est le        cas par exemple de l'&eacute;l&eacute;ment &lt;menu&gt; qui sera transform&eacute; suivant        la plateforme cible.       </li>      </ul>       <p>Fichier pour la configuration <tt>Phone.com/fr/petites images</tt>:</p>        <blockquote> <font color="#00A070"> <pre>  &lt;?php   include("../lib/gz_configuration.php");   include("../lib/gz_tools.php");   include("../lib/gz_database.mysql.php");   include("../lib/gz_identification.php");   include("../lib/gz_score.php");   header("Content-type: text/vnd.wap.wml");   echo '&lt;?xml version="1.0" encoding="iso-8859-1"?&gt;';   ?&gt;&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"                        "http://www.wapforum.org/DTD/wml_1.1.xml"&gt;         &lt;?php // reset fields   $solution="";   session_register("solution");   $nb_attempts=0;   session_register("nb_attempts");   ?&gt;&lt;wml&gt;    &lt;head&gt;     &lt;meta http-equiv="Expires" content="Thu, 01 Dec 1994 16:00:00 GMT"/&gt;     &lt;meta http-equiv="Cache-Control" content="no-cache, max-age=0"/&gt;    &lt;/head&gt;       &lt;card id="menu" title="L'&acirc;ge du capitaine"&gt;     &lt;p align="center"&gt;&lt;b&gt;L'&acirc;ge du capitaine&lt;/b&gt;&lt;/p&gt;     &lt;p align="center"&gt;&lt;img src="../../img/captain.small.wbmp"                             alt="L'&acirc;ge du capitaine"/&gt;     &lt;/p&gt;     &lt;p&gt;&lt;select&gt;      &lt;option onpick="play.php?&lt;?php echo session_name();?&gt;=        &lt;?php echo session_id();?&gt;"&gt;Jouer&lt;/option&gt;      &lt;option onpick="rules.php?&lt;?php echo session_name();?&gt;=        &lt;?php echo session_id();?&gt;"&gt;R&egrave;gles du jeu&lt;/option&gt;      &lt;option onpick="ranking.php?&lt;?php echo session_name();?&gt;=        &lt;?php echo session_id();?&gt;"&gt;Scores&lt;/option&gt;     &lt;/select&gt;&lt;/p&gt;     &lt;do label="Quitter" type="accept"&gt;&lt;go href="index.php?        &lt;?php echo session_name();?&gt;=&lt;?php echo session_id();?&gt;"/&gt;     &lt;/do&gt;    &lt;/card&gt;   &lt;/wml&gt;   &lt;?php   //gz_done();   ?&gt;</pre> </font> </blockquote>       <p>Dans ce fichier, l'&eacute;l&eacute;ment &lt;menu&gt; a &eacute;t&eacute; remplac&eacute; par &lt;select&gt;       et les &eacute;l&eacute;ments &lt;item&gt; par des &lt;option&gt;. Les r&eacute;f&eacute;rences &agrave; des       ressources texte ont &eacute;t&eacute; remplac&eacute;es par les messages en fran&ccedil;ais       et les r&eacute;f&eacute;rences &agrave; des images par leur valeur pour les petites        images.</p>       <p>Le fichier g&eacute;n&eacute;r&eacute; pour la configuration <tt>phone.com/en/grandes        images</tt> est le suivant:</p>        <blockquote> <font color="#00A070"> <pre>  &lt;?php   include("../lib/gz_configuration.php");   include("../lib/gz_tools.php");   include("../lib/gz_database.mysql.php");   include("../lib/gz_identification.php");   include("../lib/gz_score.php");   header("Content-type: text/vnd.wap.wml");   echo '&lt;?xml version="1.0" encoding="iso-8859-1"?&gt;';   ?&gt;&lt;!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"                        "http://www.wapforum.org/DTD/wml_1.1.xml"&gt;         &lt;?php // reset fields   $solution="";   session_register("solution");   $nb_attempts=0;   session_register("nb_attempts");   ?&gt;&lt;wml&gt;    &lt;head&gt;     &lt;meta http-equiv="Expires" content="Thu, 01 Dec 1994 16:00:00 GMT"/&gt;     &lt;meta http-equiv="Cache-Control" content="no-cache, max-age=0"/&gt;    &lt;/head&gt;       &lt;card id="menu" title="Age Of Captain"&gt;     &lt;p align="center"&gt;       &lt;img src="../../img/captain.big.wbmp" alt="Age Of Captain"/&gt;     &lt;/p&gt;      &lt;p&gt;&lt;a href="play.php?&lt;?php echo session_name();?&gt;=        &lt;?php echo session_id();?&gt;"&gt;Play&lt;/a&gt;&lt;/p&gt;     &lt;p&gt;&lt;a href="rules.php?&lt;?php echo session_name();?&gt;=        &lt;?php echo session_id();?&gt;"&gt;Rules of the game&lt;/a&gt;&lt;/p&gt;     &lt;p&gt;&lt;a href="ranking.php?&lt;?php echo session_name();?&gt;=        &lt;?php echo session_id();?&gt;"&gt;High scores&lt;/a&gt;&lt;/p&gt;          &lt;p&gt;&lt;a href="index.php?&lt;?php echo session_name();?&gt;=        &lt;?php echo session_id();?&gt;"&gt;Quit&lt;/a&gt;&lt;/p&gt;    &lt;/card&gt;   &lt;/wml&gt;   &lt;?php   //gz_done();   ?&gt;</pre> </font> </blockquote>       <p>Dans ce fichier, l'&eacute;l&eacute;ment &lt;menu&gt; a &eacute;t&eacute; remplac&eacute; par une       liste d'&eacute;l&eacute;ments &lt;a href=""&gt;, les r&eacute;f&eacute;rences &agrave; des       ressources texte ont &eacute;t&eacute; remplac&eacute;es par les messages en anglais       et les r&eacute;f&eacute;rences &agrave; des images par leur valeur pour les grandes       images.</p>       <p>Cette approche am&egrave;ne beaucoup de souplesse:</p>       <ul>       <li>Si l'on souhaite ajouter une langue, il suffit de rajouter        les entr&eacute;es correspondantes dans le fichier de ressources et        dans le descripteur.</li>       <li>Si l'on souhaite supporter une nouvelle famille (ou version)        de navigateur, il faut simplement &eacute;crire la feuille de style        ad&eacute;quate.</li>      </ul>            <font color="#0090D0"> <h4> <a name="3.1.2">Sites des &Eacute;ditions O'Reilly</a> </h4> </font>       <font color="#0090D0"> <h5> <a name="3.1.2.1">Pourquoi avoir choisi XML ?</a> </h5> </font> <p> </p>       <p>Le choix de XML nous a sembl&eacute; le meilleur pour plusieurs raisons :</p>      <ul>       <li>Le site est essentiellement un <i>catalogue</i> (pas exclusivement        toutefois, cet article en t&eacute;moigne). On est donc amen&eacute; &agrave; g&eacute;rer de        nombreuses pages donc la mise en forme est identique (les pages        des livres). Il est alors int&eacute;ressant de dissocier le fond de la forme,        afin que les &eacute;diteurs n'aient pas &agrave; faire du formatage HTML.</li>       <li>Les pages se doivent de suivre la charte graphique de celles        du site am&eacute;ricain, qui est amen&eacute;e &agrave; changer. Avec un site en HTML,        la modification de cette charte demanderait &agrave; ce que <i>toutes</i>        les pages du site soient modifi&eacute;es manuellement (soit environ 300         pages &agrave; l'heure actuelle). Cela donnerait des sueurs froides &agrave; tout        webmestre.</li>       <li>La possibilit&eacute; de validation des documents permet d'&eacute;viter        certaines erreurs (d'omission en particulier).</li>       <li>&Agrave; chaque compilation, la syntaxe HTML et les liens        de toutes les pages du site sont v&eacute;rifi&eacute;s. Nous avons donc        l'assurance que le rendu est correct sur tout navigateur et qu'il        n'existe aucun lien cass&eacute;.</li>      </ul>      <font color="#0090D0"> <h5> <a name="3.1.2.2">Choix techniques</a> </h5> </font> <p> </p>       <p>Les informations pouvant &ecirc;tre raisonnablement mises &agrave; jour       quotidiennement, nous avons opt&eacute; pour une solution de        <i>compilation statique</i> des pages du site : les pages HTML sont       g&eacute;n&eacute;r&eacute;es &agrave; partir des sources XML puis envoy&eacute;es au serveur.</p>       <p>Il existe deux autres solutions :</p>      <ul>       <li>G&eacute;n&eacute;ration des pages par <i>servlets</i> : les fichiers        html sont g&eacute;n&eacute;r&eacute;es lorsqu'ils sont appel&eacute;s. Cette m&eacute;thode        est indispensable lorsque les informations contenues dans les        pages changent tr&egrave;s fr&eacute;quemment, les pages sont ainsi toujours &agrave;         jour. Le revers de la m&eacute;daille est que cette m&eacute;thode est gourmande        en ressources CPU c&ocirc;t&eacute; serveur.</li>       <li>G&eacute;n&eacute;ration des pages <i>par le navigateur</i> : elle a        les avantages de la m&eacute;thode pr&eacute;c&eacute;dente sans en avoir les         inconv&eacute;nients. Cependant, les navigateurs ne sont pas encore        capables de r&eacute;aliser une transformation XSL de mani&egrave;re fiable.        Il est donc pr&eacute;f&eacute;rable de s'en tenir pour le moment au HTML.        Dans un futur plus ou moins proche, c'est une solution qui        sera probablement envisageable.</li>      </ul>      <font color="#0090D0"> <h5> <a name="3.1.2.3">Architecture</a> </h5> </font> <p> </p>       <p>Le site est g&eacute;n&eacute;r&eacute; enti&egrave;rement &agrave; chaque compilation (pour       &eacute;viter des probl&egrave;mes de d&eacute;pendances) &agrave; partir d'une arborescence       de fichiers XML. Les fichiers de m&ecirc;me type sont plac&eacute;s dans le m&ecirc;me       r&eacute;pertoire. Les types de fichiers sont au nombre de six :</p>       <ul>       <li> <b>Catalogue :</b> ces fichiers pr&eacute;sentent les ouvrages du        catalogue. Chaque fichier (d&eacute;crivant un livre) g&eacute;n&egrave;re entre trois        et six fichiers HTML (index, auteur, description, critiques,        errata et exemples). Ces pages sont li&eacute;es entre elles et aux pages        des cat&eacute;gories (Java, Logiciels Libres, Perl, etc.).</li>       <li> <b>Article :</b> g&eacute;n&egrave;re l'article sous forme HTML et place un r&eacute;sum&eacute; dans les pages de cat&eacute;gories ad&eacute;quates.</li>       <li> <b>br&egrave;ve :</b> ces br&egrave;ves sont int&eacute;gr&eacute;es &agrave; la page d'accueil        du site et/ou &agrave; des pages de cat&eacute;gories.</li>       <li> <b>club :</b> g&eacute;n&egrave;rent les pages du         <a href="http://www.editions-oreilly.fr/club">http://www.editions-oreilly.fr/club</a>.       </li>       <li> <b>infos :</b> comme les br&egrave;ves, mais en plus long et sans         date.</li>      </ul>       <p>Les pages d'index (la page d'accueil et les pages des cat&eacute;gories)       sont g&eacute;n&eacute;r&eacute;es par des fichiers XSL appliqu&eacute;s sur l'index XML du site :       un fichier XML regroupant tous les fichiers XML des sources. Il est       ainsi possible de g&eacute;n&eacute;rer les listes des ouvrages class&eacute;es par       ordre alphab&eacute;tique, la liste des br&egrave;ves class&eacute;es par date, etc.</p>       <p>Ainsi, la page d'accueil regroupe des fragments de nombre de       fichiers XML :</p>             <p> <center> <img src="../img/java-xml.page-accueil.png" vspace="10" hspace="10"><br> <font color="#0090D0">Figure&nbsp;2:&nbsp;Structure de la page d'accueil du site</font> </center> </p>            <p>Les fichiers &agrave; l'origine des diff&eacute;rentes zones de cette page sont les       suivants :</p>      <ol>       <li>La liste des cat&eacute;gories est cod&eacute;e dans le fichier XSL qui        g&eacute;n&egrave;re la page d'accueil.</li>       <li>Les br&egrave;ves proviennent du r&eacute;pertoire <i>breves</i> des sources.        Seules les br&egrave;ves ayant <i>index</i> pour cat&eacute;gorie y sont        int&eacute;gr&eacute;es.</li>       <li>Les articles pr&eacute;sent&eacute;s sur cette page sont ceux marqu&eacute;s de        l'&eacute;l&eacute;ment &lt;nouveau/&gt;.</li>       <li>Suivent des infos issues du r&eacute;pertoire <i>info</i> et de la        cat&eacute;gorie <i>index</i>.</li>       <li>Pour finir, la liste des nouveaut&eacute;s est g&eacute;n&eacute;r&eacute;e &agrave; partir des        fichiers du catalogue. Seuls les ouvrages dont les        fiches sont marqu&eacute;es de l'&eacute;l&eacute;ment &lt;nouveau/&gt; sont int&eacute;gr&eacute;es &agrave;        cette page.</li>      </ol>       <p>Pour conclure, je dirais que XML permet de g&eacute;rer un tel site de        mani&egrave;re rationnelle et en pr&eacute;servant les investissements des       &Eacute;ditions O'Reilly du fait que XML est un standard et donc &agrave; l'abri       du bon vouloir d'un unique &eacute;diteur de logiciel.</p>                <font color="#0090D0"> <h3> <a name="3.2">Programmation d'applications modulaires</a> </h3> </font>      <p>L'id&eacute;e de cette approche de la programmation est de charger un      arbre de Beans &agrave; partir d'un fichier de configuration XML. on peut      en effet assez facilement d&eacute;finir une syntaxe pour "mapper" des      beans sur des &eacute;l&eacute;ments XML:</p>      <ul>      <li>Lorsque le parser rencontre un &eacute;l&eacute;ment <tt>Foo</tt>, il        instancie (en utilisant l'API d'introspection) un objet de       la classe <tt>Foo</tt>.</li>      <li>Le parser appelle ensuite les m&eacute;thodes <tt>setBar()</tt>       sur l'objet instanci&eacute; pour tout attribut <tt>Bar</tt>.</li>      <li>Tout objet instanci&eacute; est ajout&eacute; &agrave; son parent (l'&eacute;l&eacute;ment       qui le contient) avec la m&eacute;thode <tt>add()</tt>.</li>     </ul>      <p>Par exemple, le fichier XML suivant:</p>       <blockquote> <font color="#00A070"> <pre> &lt;?xml version="1.0"?&gt;  &lt;GrandPere Nom="Emile"&gt;   &lt;Fils Nom="Bernard"/&gt;   &lt;Fille Nom="Louise"&gt;     &lt;PetitFils Nom="Marc" Age="10"/&gt;   &lt;/Fille&gt; &lt;/GrandPere&gt;</pre> </font> </blockquote>      <p>Lors du parsing de ce fichier, le parser va r&eacute;aliser les actions      suivantes:</p>      <ul>      <li>Instanciation d'un objet <tt>GrandPere</tt> </li>      <li>Appel de la m&eacute;thode <tt>setNom("Emile")</tt> </li>      <li>Instanciation d'un objet <tt>Fils</tt> </li>      <li>Appel de la m&eacute;thode <tt>setNom("Bernard")</tt> </li>      <li>Appel de la m&eacute;thode <tt>add(Fils)</tt> sur l'objet       <tt>GrandPere</tt> </li>      <li>etc...</li>     </ul>     <p>On obtient en m&eacute;moire une structure du type:</p>            <p> <center> <img src="../img/java-xml.bean-tree.png" vspace="10" hspace="10"><br> <font color="#0090D0">Figure&nbsp;3:&nbsp;Arbre de beans en m&eacute;moire</font> </center> </p>     <p>Cette approche est tr&egrave;s utile dans la mesure o&ugrave; ce syst&egrave;me     permet une configuration simple du programme (il suffit de modifier     le fichier XML, avec un simple &eacute;diteur ou un outil graphique     d&eacute;di&eacute;). D'autre part, il est tr&egrave;s extensible: pour utiliser un     nouveau type de bean, il suffit de le placer dans le CLASSPATH     du programme, de placer son &eacute;l&eacute;ment associ&eacute; dans le fichier     de configuration et le tour est jou&eacute; !</p>     <p>Cette approche commence &agrave; prendre une grande importance en     programmation Java et il me semble que c'est maintenant un paradigme     incontournable utilis&eacute; dans un nombre croissant d'applications     r&eacute;centes.</p>     <p>Nous allons maintenant voir un certain nombre d'exemples de     mise en oeuvre de cette approche:</p>      <font color="#0090D0"> <h4> <a name="3.2.1">Syst&egrave;me de Log de GameZilla</a> </h4> </font>       <p>Les logs sont envoy&eacute;s (par RMI) au serveur de log qui les empile        (pour rendre la main imm&eacute;diatement au client). Les logs sont       d&eacute;pil&eacute;s par un <i>Consumer</i> qui les envoie aux <i>tuyaux</i>       pour filtrage et s&eacute;rialisation. L'architecture d'un tuyau de       log est la suivante:</p>             <p> <center> <img src="../img/java-xml.log-server.png" vspace="10" hspace="10"><br> <font color="#0090D0">Figure&nbsp;4:&nbsp;Architecture du serveur de logs de GameZilla</font> </center> </p>                   <p>Le filtre permet de s&eacute;lectionner les logs &agrave; s&eacute;rialiser dans ce canal       de log. Les logs passent ensuite par les channels qui d&eacute;finissent       un moyen de persistance (dans des fichiers, dans une BD, par mail       ou sur la console).</p>       <p>Pour configurer ce syst&egrave;me, nous avons mis en oeuvre la technique       de mapping XML/Beans expos&eacute;e ci-dessus. Voici un exemple de fichier       de configuration d'un tuyau de logs:</p>        <blockquote> <font color="#00A070"> <pre> &lt;pipe name="ExenInfos"&gt;    &lt;filter&gt;    &lt;and&gt;     &lt;source name="ExenTFTPServerV1.0"/&gt;     &lt;priority min="0" max="1"/&gt;     &lt;not&gt;      &lt;or&gt;       &lt;type name="Request"/&gt;       &lt;type name="TransferComplete"/&gt;      &lt;/or&gt;     &lt;/not&gt;    &lt;/and&gt;   &lt;/filter&gt;    &lt;channels&gt;    &lt;file name="/home/casa/tmp/exen-infos.xml" formatter="XmlFormatter"/&gt;   &lt;/channels&gt;   &lt;/pipe&gt;</pre> </font> </blockquote>       <p>Ce fichier de configuration indique que:</p>       <ul>       <li>On applique un filtre s&eacute;lectionnant les logs dont la source        est <i>ExenTFTPServerV1.0</i>, dont le priorit&eacute; est comprise        entre 0 et 1 et dont le type n'est ni <i>Request</i>, ni        <i>TransferComplete</i>.</li>       <li>Ils sont envoy&eacute;s dans un fichier <i>exen-infos.xml</i>        apr&egrave;s avoir &eacute;t&eacute; format&eacute;s en XML.</li>      </ul>       <p>L'arbre d'objets associ&eacute;s &agrave; un tuyau est construit &agrave; partir       du fichier de configuration puis les logs y sont envoy&eacute;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&eacute;cessaire de d&eacute;velopper un outil graphique dans la phase de       d&eacute;veloppement.</p>       <p>Pour la configuration &agrave; chaud, les fichiers sont envoy&eacute;s       &agrave; 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.</p>       <p>D'autre part, le syst&egrave;me est facilement extensible car il       suffit, pour ajouter un channel (SMS par exemple), de d&eacute;velopper       le bean correspondant (en impl&eacute;mentant une interface propre aux       channels) , de le placer dans le CLASSPATH puis de changer le       fichier de configuration.</p>            <font color="#0090D0"> <h4> <a name="3.2.2">Free Java Installer</a> </h4> </font>       <ul>       <li> <a href="http://www.sweet-ohm.com/html/fiji.html">http://www.sweet-ohm.com/html/fiji.html</a> </li>       <li>Licence <a href="http://www.gnu.org/copyleft/gpl.html">http://www.gnu.org/copyleft/gpl.html</a> </li>      </ul>       <p>Ce 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:</p>        <blockquote> <font color="#00A070"> <pre>  &lt;?xml version="1.0" encoding="iso-8859-1"?&gt;    &lt;install jar="/tmp/fiji-0.4.jar"            logo="lib/logo.gif"&gt;          &lt;text title="FiJI"             text="This program will install Fiji on\                   your computer. Hit [|&gt;] to continue\                   or [O] to abort installation."/&gt;       &lt;license file="lib/LICENSE"/&gt;       &lt;copy dir="tmp"             property="fiji.home"             defaults="Windows=c:\Fiji,Unix=/usr/local/fiji"&gt;             &lt;filter file="bin/fiji" from="@HOME@" to="${fiji.home}"/&gt;             &lt;filter file="bin/fiji.bat" from="@HOME@" to="${fiji.home}"/&gt;       &lt;/copy&gt;       &lt;link from="${fiji.home}/bin/fiji"             to="/usr/local/bin"             mandatory="no"/&gt;       &lt;append file="c:\autoexec.bat"               line="set PATH=%PATH%;${fiji.home}\bin"               os="Windows"               mandatory="no"/&gt;       &lt;text title="Congratulation !"             text="FiJI have been installed succesfully.\                   Hit [O] to terminate this program."/&gt;   &lt;/install&gt;</pre> </font> </blockquote>            <p>Chacun des &eacute;l&eacute;ments de ce fichier correspond &agrave; une &eacute;tape de       cette installeur (une t&acirc;che):</p>             <p> <center> <img src="../img/java-xml.fiji-1.png" vspace="10" hspace="10"><br> <font color="#0090D0">Figure&nbsp;5:&nbsp;&Eacute;cran d'acceuil</font> </center> </p>                   <p>Cet &eacute;cran correspond &agrave; l'&eacute;l&eacute;ment XML suivant:</p>        <blockquote> <font color="#00A070"> <pre>      &lt;text title="FiJI"             text="This program will install Fiji on\                   your computer. Hit [|&gt;] to continue\                   or [O] to abort installation."/&gt;</pre> </font> </blockquote>            <p> <center> <img src="../img/java-xml.fiji-2.png" vspace="10" hspace="10"><br> <font color="#0090D0">Figure&nbsp;6:&nbsp;&Eacute;cran de licence</font> </center> </p>       <p>Celui-ci correspond au suivant:</p>        <blockquote> <font color="#00A070"> <pre>      &lt;license file="lib/LICENSE"/&gt;</pre> </font> </blockquote>       <p>Lors de la construction de l'installeur, le fichier XML de       configuration est pars&eacute; et l'arbre de beans (qui &eacute;tendent la        classe <i>Task</i>) construit. Cet arbre est ensuite s&eacute;rialis&eacute;       dans le fichier jar qui constitue l'installeur.</p>       <p>Lorsque l'installeur est lanc&eacute;, il d&eacute;s&eacute;rialise l'arbre des       t&acirc;ches et appelle la m&eacute;thode <tt>process</tt> sur le bean        racine. Le fichier XML de configuration n'est plus n&eacute;cessaire       et n'est donc pas embarqu&eacute; dans le fichier jar.</p>       <p>Cette approche permet de rendre le programme extensible du       fait que l'on peut programmer d'autres t&acirc;ches. Pour les utiliser,       il suffit de les placer dans le <i>CLASSPATH</i> et de les       invoquer dans le fichier de configuration.</p>              <p>Cette technique qui me semble extr&egrave;mement prometteuse est de plus      en plus utilis&eacute;e en programmation Java. On pourra en particulier      &eacute;tudier le fonctionnement du programme      <a href="http://jakarta.apache.org/ant">http://jakarta.apache.org/ant</a> qui repose      sur le m&ecirc;me principe.</p>              <hr noshade="true" size="0"> <font size="-1">      Derni&egrave;re mise &agrave; jour&nbsp;:&nbsp;     2001-01-28</font> </td> </tr> </table> </body> </html> 
