PROJET TUTORE :
ANALYSEUR XML



Projet proposé par l'Université de Marne la Vallée pour la licence informatique 2000-2001.






    Tuteur : Maxime Crochemore
    Langage de programmation : C, C++, Java, documentation en HTML
    Environnement de développement : UNIX ou Linux

    Sujet

    L'objectif de ce projet est de développer un analyseur du langage XML. Nous prendrons en compte un sous-ensemble significatif du langage. Nous établirons une traduction en XHTML (ou HTML) en y associant une feuille de style. Nous essaierons de développer une application associée à l'analyseur.
    Les éléments principaux du projet comportent :
    • élaboration d'un analyseur de XML.
    • définition d'une traduction en XHTML.
    • écriture d'une feuille de style en XSL (ou de type CSS) associée au jeu de balises retenues.
    • élaboration d'un traducteur.
    • développement d'une application.

    Documents

  • LaTeX par L. Lamport chez Addison-Wesley, 1985.
    • Recommandations du W3C sur MathML, XML et XSL ; voir aussi XML.COM.
    • Exemples de latex2html, tthmml ou tex4ht (voir W3C Math).







    COMPOSITION DU GROUPE :

    • David Hav
    • Jonathan Kalfa
    • Florence Liu
    • Yannick Mulot
    • Ludovic Wattiez


    Pour nous écrire ==>







    28 Février 2001

    PREMIERS PAS DANS LE XML :

    Nous avons d'abord chercher à comprendre la syntaxe du XML.

    Premières remarques :
    • Il existe deux types de balises :
      <ELEMENT>informations</ELEMENT>
      <ELEMENT/> est une balise qui peut ne pas contenir d'informations.
    • Pour le nom des éléments, les majuscules et les minuscules sont distingués. Si on ferme une balise <Element> par </element>, il y a une erreur.
    • Les accents ne sont pas reconnus sauf si on le précise (à voir)
    • Comme pour le HTML les balises peuvent contenir des attributs : <LIVRE TITRE = "Introduction a xml">


    Différences avec le HTML :
    • La balise fermante est obligatoire.
    • Les éléments doivent s'imbriquer proprement les uns dans les autres : aucun chevauchement n'est autorisé.
    • Les attributs doivent être entre guillemets ou quotes.


    Dans la suite il nous faut chercher toutes les erreurs possibles en XML.
    Pour l'instant nous avons étudié la façon d'écrire un programme qui lit un fichier XML et repère les erreurs syntaxique.







    PROGRAMMATION :

    Le langage de programmation choisi est le C mais il se peut que nous programmons aussi en Java pour pouvoir éxécuter le programme aussi bien sous Linux que sous Windows sans à avoir à recompiler. De plus pour la reconnaissance des balises pourrait se faire en Flex.

    Structures de données :
    Nous voulons vérifier la syntaxe du fichier, c'est-à-dire si pour chaque balise ouvrante il y a une balise fermante.
    Pour cela nous avons décidé d'utiliser une pile pour les noms des éléments.

    Pile :
    La pile est une liste de chaines de caractères.
    typedef struct element
    {
      char *chaine;
      struct element * suivant;
    }Element, *Pile;
    
    En définissant une liste nous ne limitons pas le nombre de balises. Les noms des balises sont donc ajoutés en début de liste et nous retirons également en début de liste.

    Algorithmes :
    Il faudra lors du parcours du fichier faire la distinction entre le nom de la balise et ses attributs! Le nom du fichier n'est pas toute la chaine entre < > mais la première chaine dans la balise.
    Nous empilons au fur et à mesure que nous rencontrons des balises ouvrantes. Dès que nous avons une balise fermante, nous dépilons le premier élément de la pile et nous comparons les chaines. Si ce sont les mêmes nous continuons à lire le fichier Sinon nous arrêtons le parcours.

    Petit plus :
    Nous avons pensé à la gestion des erreurs :
    • nous pourrions corriger l'erreur automatiquement
    • nous pourrions proposer plusieurs corrections
    • nous pourrions faire éditer l'utilisateur







    06 Mars 2001

    STRUCTURES DE DONNEES :

    Nous avons donc programmé les piles en C et en Java.
    En Java, nous avons créé deux classes, une pour l'élément de la pile, l'autre pour la pile.

    PROGRAMMATION :

    Le programme reconnait les erreurs :

    - si les balises normales (<TRUC> </TRUC>) ne se ferment pas la ou il faut. (chevauchement de balises ou absence de balise fermante)
    - s'il y a une erreur sur un attribut dans une balise (oublie de mettre les nom des attributs entre guillements ou oublie du signe d'égalité).

    Début de programmation d'une interface en Java.







    13 Mars 2001

    VERIFICATIONS A FAIRE DANS UN FICHIER XML :

    Un document XML est bien formé si :

    • il contient une déclaration XML
    • il contient un ou plusieurs éléments
    • il contient un élément racine encapsulant tous les autres éléments et leurs attributs (ex <HTML> ... </HTML>)
    • les éléments non vides ont une balise de début et de fin
    • les éléments non vides sont correctement imbriqués (<P> <EM> ... </EM> </P>)
    • les éléments vides ont un / à la fin de la balise avant le >
    • les noms des balises ouvrantes et fermantes correspondent
    • un nom d'attribut apparaît uniquement dans la balise ouvrante et une seule fois dans cette balise
    • les valeurs des attributs sont entre guillemets ou apostrophes
    • la valeur des attributs n'appelle pas d'entités externes directement ou indirectement
    • les caractères réservés sont remplacés par des références d'entités (par ex. & lt ; pour <)
    • toutes les références à des entités non binaires doivent commencer par & et finir par ;
    • s'il n'y a pas de DTD, les seules entités utilisées sont celles réservées de XML & amp ; & lt ; & gt ; & apos ; & quot ;
    • s'il y a une DTD toutes les entités non réservées utilisées sont déclarées dans la DTD.







    1er Avril 2001

    FICHIERS XML :

    Pour lire un fichier XML il faut un navigateur compatible. Aujourd'hui, le seul navigatuer entièrement compatible XML est Internet Explorer 5.0.
    Internet Explorer 5.0 affiche XML. En fait il l'analyse et indique s'il y a des erreurs dans le fichier XML puis interprète la feuille de style (XSL) pour afficher correctement la page.
    Notre but est donc de faire comme Internet Explorer :
    • analyser le fichier et s'il y a des erreurs les indiquer précisément (voire les corriger)
      • verifier les balises (voir au dessus)
      • verifier l'existence des fichiers DTD, CSS, XSL (s'ils sont déclarés dans le fichier XML)
      • verifier le contenu de la DTD
    • traduire le fichier : générer la page HTML correspondante
      Nous supposons que les fichiers XML, DTD et la feuille de style sont corrects et crééons la page HTML.
      Si la feuille de style n'existe pas nous affichons l'aborescence de la structure du fichier XML (qui ressemble beaucoup au code).




    EXEMPLES DE DTD :


    DTD interne DTD externe
    Fichier XML :
    
    <?xml version="1.0& encoding="ISO-8859-1"?>
    <!DOCTYPE livre [
    <!ELEMENT MON (MOT)+>
    <!ELEMENT MOT (PHRASE, ENVELOPPE, PAGE)>
    <!ELEMENT PHRASE (#PCDATA)>
    <!ELEMENT ENVELOPPE (#PCDATA)>
    <!ELEMENT PAGE (#PCDATA)>
    ]>
    <MON>
    <MOT>
    <PHRASE>Super</PHRASE>
    <ENVELOPPE>Noir</ENVELOPPE>
    <PAGE>Numéro</PAGE>
    </MOT>
    </MON>
    
    
    
    
    
    
    Fichier XML :
    
    <?xml version="1.0& encoding="ISO-8859-1"?>
    <!DOCTYPE livre SYSTEM "externe.dtd">
    <MON>
    <MOT>
    <PHRASE>Super</PHRASE>
    <ENVELOPPE>Noir</ENVELOPPE>
    <PAGE>Numéro</PAGE>
    </MOT>
    </MON>
    
    
    Fichier DTD : externe.dtd
    
    <!ELEMENT MON (MOT)+>
    <!ELEMENT MOT (PHRASE, ENVELOPPE, PAGE)>
    <!ELEMENT PHRASE (#PCDATA)>
    <!ELEMENT ENVELOPPE (#PCDATA)>
    <!ELEMENT PAGE (#PCDATA)>
    
    
    Il faut que toutes les balises du fichier XML soit déclarées dans la DTD. (quoique ça marche quand même s'il manque une balise.)



    EXEMPLES DE FEUILLE DE STYLE :


    CSS XSL
    Fichier XML :
    
    <?xml version="1.0"?>
    <?xml-stylesheet href="affichage.css" type="text/css"?>
    <PHRASE xmlns="http://www.w3.org/TR/REC-html40">
    <MOT>Hello XML</MOT>
    <LETTRE>Nouveau programme</LETTRE>
    <html:H1 class="Texte">Nouveau langage</html:H1>
    <html:H1 class="plus">Nouveau quoi</html:H1>
    <html:img src="image.jpg"/>
    </PHRASE>
    
    
    Fichier CSS :
    
    MOT
    {
    font family: font-family: Verdana, Arial, Helvetica;
    font size: 40pt;
    color: blue;
    position: absolute;
    letf: 110 px;
    top: 10 px;
    }
    LETTRE
    {
    font family: Helvetica, Arial;
    font size: 20pt;
    font style: italic;
    color: red;
    position: absolute;
    letf: 90 px;
    top: 80 px;
    }
    .Texte
    {
    font family: font-family: Verdana, Arial, Helvetica;
    font size: 40pt;
    color: darkblue;
    position: absolute;
    letf: 150 px;
    top: 100 px;
    }
    
    .plus
    {
    font family: Arial;
    font size: 40pt;
    color: green;
    position: absolute;
    letf: 20 px;
    top: 200 px;
    }
    
    
    Fichier XML :
    
    <?xml version="1.0& encoding="ISO-8859-1"?>
    <?xml-stylesheet href="affichge.xsl" type="text/xsl"?>
    <DECLARATION>
    <PLUS>
    <HAUT>
    Différents styles
    </HAUT>
    <CENTRE>
    Voici une possibilité de rendre les pages plus attrayantes
    </CENTER>
    <TEXTE>
    Soyez très attentif à la syntaxe
    </TEXTE>
    </PLUS>
    </DECLARATION>
    
    
    FICHIER XSL :
    
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
    <xsl:template>
    <xsl:for-each select="DECLARATION/PLUS">
    <H1 STYLE="color:Red; font-size:30pt;">
    <xsl:value-of select="HAUT"/>
    </H1>
    <U STYLE="color:Blue; font-size:20pt;">
    <xsl:value-of select="CENTRE"/>
    </U>
    <H2 STYLE="color:Gray; font-size:10pt;">
    <xsl:value-of select="TEXTE"/>
    </H2>
    </xsl:for-each>
    </xsl:template>
    </xsl:stylesheet>
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    XSL est une extension du CSS donc offre plus de possibilités.



    REMARQUES SUR LES BALISES XML :


    Dans l'exemple du CSS, le fichier XML contient des balises HTML. Elles sont de la forme :
    <html:u>Souligné</html:u>


    LISTE DES BALISES CONFORMES A LA SPECIFICATION XHTML
    <a> <abbr> <acronym> <address>
    <applet> <area> <b> <base>
    <basefont> <bdo> <big> <blockquote>
    <body> <br> <button> <caption>
    <center> <cite> <code> <col>
    <colgroup> <dd> <del> <dfn>
    <dir> <div> <dl> <dt>
    <em> <fieldset> <font> <form>
    <frame> <frameset> <h1> - <h6> <head>
    <hr> <html> <i> <lframe>
    <img> <input> <ins> <lsindex>
    <kbd> <label> <LEGEND> <li>
    <link> <map> <menu> <meta>
    <noframe> <noscript> <object> <ol>
    <optgroup> <option> <p> <param>
    <pre> <q> <s> <samp>
    <script> <select> <small> <span>
    <strike> <strong> <style> <sub>
    <sup> <table> <tbody> <td>
    <textarea> <tfoot> <th> <thead>
    <title> <tr> <tt> <u>
    <ul> <var>