TP 2, 30/09/2009

Par Benoît Valiron <benoit.valiron [at] monoidal.net> et Jean Baptiste FADDOUL <jean-baptiste.faddoul [at] xrce.xerox.com>

Tout d'abord, quelques informations:

Et maintenant, le TP à proprement parler.

  1. Corrigez le fichier XML avec DTD interne suivant (et vérifiez qu'il valide):

    <!DOCTYPE videocollection [
        <!ENTITY R "Romance">
        <!ENTITY WAR "War">
        <!ENTITY COM "Comedy">
        <!ENTITY SF "Science Fiction">
        <!ENTITY ACT "Action">
        <!ENTITY SF_ACT "%SF and %ACT">
    ]>
    <videocollection>
       <title id="1">Tootsie</title>
       <genre>%COM;</genre>
       <year>1982</year>
    
       <title id="2">Jurassic Park</title>
       <genre>%SF;</genre>
       <year>1993</year>
          
       <title id="3">Mission Impossible</title>
       <genre>%ACT;</genre>
       <year>1996</year>   
    </videocollection>

    CORRECTION

    <!DOCTYPE videocollection [
        <!ENTITY R "Romance">
        <!ENTITY WAR "War">
        <!ENTITY COM "Comedy">
        <!ENTITY SF "Science Fiction">
        <!ENTITY ACT "Action">
        <!ENTITY SF_ACT "&SF; and &ACT;">
    ]>
    <videocollection>
        <title id="1">Tootsie</title>
        <genre>&COM;</genre>
        <year>1982</year>
    
        <title id="2">Jurassic Park</title>
        <genre>&SF;</genre>
        <year>1993</year>
           
        <title id="3">Mission Impossible</title>
        <genre>&ACT;</genre>
        <year>1996</year>   
    </videocollection>
    
    
  2. Créez un fichier .html qui contient le texte suivant (remplacez les ... en suivant le modèle), et ouvrez-le avec firefox. Combien de "Tic" sont-ils affichés ?

    <?xml version="1.0"?>
    <!DOCTYPE texte [
    <!ELEMENT texte (#PCDATA)>
    <!ENTITY b1 "Tic ">
    <!ENTITY b2 '&b1; &b1;'>
    <!ENTITY b3 '&b2; &b2;'>
    <!ENTITY b4 '&b3; &b3;'>
    <!ENTITY b5 '&b4; &b4;'>
    <!ENTITY b6 '&b5; &b5;'>
    <!ENTITY b7 '&b6; &b6;'>
    <!ENTITY b8 '&b7; &b7;'>
    <!ENTITY b9 '&b8; &b8;'>
    <!ENTITY b10 '&b9; &b9;'>
    <!ENTITY b11 '&b10; &b10;'>
    <!ENTITY b12 '&b11; &b11;'>
    <!ENTITY b13 '&b12; &b12;'>
    <!ENTITY b14 '&b13; &b13;'>
    <!ENTITY b15 '&b14; &b14;'>
    <!ENTITY b16 '&b15; &b15;'>
    <!ENTITY b17 '&b16; &b16;'>
    ]>
    <texte>&b17;</texte>

    Et si on mets 60 entités générales b1 -> b60 ? Quel problème cela peut-il poser ? Que répond firefox (vous pouvez n'en mettre que 20, ça devrait suffire) ? Que s'est-il passé ?

  3. Quel est le problème ici :

    <?xml version="1.0"?>
    <!DOCTYPE texte [
    <!ELEMENT texte (#PCDATA)>
    <!ENTITY tic "&tac;">
    <!ENTITY tac "&tic;">
    ]>
    <texte>&tac;</texte>

    Lancez le fichier avec firefox pour voir l'erreur générée.

  4. Dans cette question on reprend la partie 2 de "Document Composite" du TD-2 (sur la page du cours), avec un exemple réel.

    Le site tel.archives-ouvertes.fr de publication de thèses propose un service de téléchargement des nouveautés au format RSS. Voila un exemple obtenu hier à l'adresse http://tel.archives-ouvertes.fr/rss.php?language=fr&dc=1. Vous pouvez si vous le souhaitez télécharger à nouveau le fichier, vous aurez les toutes dernières soumissions : le fichier est produit en temps réel et mis à jour en fonction des ajouts.

    Le format utilisé est le format RSS (dont une DTD a été donnée en TD 2) additionné du format Dublin Core pour donner la sémantique d'informations supplémentaires, tel l'auteur de la thèse, etc. L'idée est qu'un logiciel standard va omettre le Dublin Core et se concentrer sur le RSS (ouvrez le fichier avec firefox : il ne vous affiche que ça), mais qu'un robot listant les thèses va uniquement lire le Dublin Core pour mettre à jour sa base de données. Il pourra alors automatiquement trouver l'auteur, la date de publication...

    Dans cet exercice, on vous demande d'écrire une DTD validant le fichier fourni. Si votre DTD est suffisamment complête, vous pourrez même valider un autre flux RSS provenant de la même source. Par exemple, le fichier contenant toutes les thèses de 2005 (attention : il fait 4 mega octets).

    Pour vous aidez à démarrer, on donne un début de DTD à complèter (il manque des éléments). Vous pouvez bien sûr vous inspirer de ce qui a été donné en TD.

    <!ELEMENT rss ...
    <!ELEMENT channel ...
    <!ELEMENT title ...
    <!ELEMENT link ...
    <!ELEMENT description ...
    <!ELEMENT generator ...
    <!ELEMENT item ...
    <!ELEMENT dc:creator ...
    <!ELEMENT dc:date ...
    <!ELEMENT dc:description ...
    <!ELEMENT dc:identifier ...
    <!ELEMENT dc:language ...
    

    la meilleur façon de procéder est probablement de tenter une validation avec une DTD incomplète. Le validateur va raler et vous indiquer ce qui manque.

    Pour valider le fichier, vous pouvez soit mettre directement votre DTD en interne ou la placer dans un fichier externe theses.dtd et l'intégrer avec une entête DOCTYPE SYSTEM. Il vous reste à suivre les informations données au TP précédant pour valider le fichier. Nous vous conseillons d'utiliser le .jar.

    CORRECTION

    <!ELEMENT rss (channel)>
    <!ATTLIST rss xmlns:dc CDATA #IMPLIED
                  version CDATA #REQUIRED>
    
    <!ELEMENT channel (title,link,description,generator,item*)>
    <!ELEMENT title (#PCDATA)>
    <!ELEMENT link (#PCDATA)>
    <!ELEMENT description (#PCDATA)>
    <!ELEMENT generator (#PCDATA)>
    <!ELEMENT item (link|pubDate|title|dc:contributor|dc:coverage|
                    dc:creator|dc:date|dc:description|dc:identifier|
                    dc:language|dc:publisher|dc:source|dc:subject|
                    dc:title|dc:type|description)*>
    <!ELEMENT dc:creator (#PCDATA)>
    <!ELEMENT dc:date (#PCDATA)>
    <!ELEMENT dc:description (#PCDATA)>
    <!ELEMENT dc:identifier (#PCDATA)>
    <!ELEMENT dc:language (#PCDATA)>
    <!ELEMENT dc:publisher (#PCDATA)>
    <!ELEMENT dc:source (#PCDATA)>
    <!ELEMENT dc:coverage (#PCDATA)>
    <!ELEMENT dc:subject (#PCDATA)>
    <!ELEMENT dc:title (#PCDATA)>
    <!ELEMENT dc:type (#PCDATA)>
    <!ELEMENT dc:contributor (#PCDATA)>
    <!ELEMENT pubDate (#PCDATA)>
    
  5. Décoration: changez la déclaration des espaces de noms en utilisant l'héritage pour rendre cet XML plus simple avec le moindre des préfixes.

    <h:html xmlns:xdc="http://www.xml.com/books"
            xmlns:h="http://www.w3.org/HTML/1998/html4">
     <h:head><h:title>Book Review</h:title></h:head>
     <h:body>
      <xdc:bookreview>
       <xdc:title>XML: A Primer</xdc:title>
       <h:table>
        <h:tr align="center">
         <h:td>Author</h:td><h:td>Price</h:td>
         <h:td>Pages</h:td><h:td>Date</h:td></h:tr>
        <h:tr align="left">
         <h:td><xdc:author>Simon St. Laurent</xdc:author></h:td>
         <h:td><xdc:price>31.98</xdc:price></h:td>
         <h:td><xdc:pages>352</xdc:pages></h:td>
         <h:td><xdc:date>1998/01</xdc:date></h:td>
        </h:tr>
       </h:table>
      </xdc:bookreview>
     </h:body>
    </h:html>
    

    CORRECTION

    <html xmlns="http://www.w3.org/HTML/1998/html4"
          xmlns:xdc="http://www.xml.com/books">
     <head><title>Book Review</title></head>
     <body>
      <xdc:bookreview>
       <xdc:title>XML: A Primer</xdc:title>
       <table>
        <tr align="center">
         <td>Author</td><td>Price</td>
         <td>Pages</td><td>Date</td></tr>
        <tr align="left">
         <td><xdc:author>Simon St. Laurent</xdc:author></td>
         <td><xdc:price>31.98</xdc:price></td>
         <td><xdc:pages>352</xdc:pages></td>
         <td><xdc:date>1998/01</xdc:date></td>
        </tr>
       </table>
      </xdc:bookreview>
     </body>
    </html>
    
  6. Écrire une DTD pour l'exercice précédant, en utilisant des entités paramètres pour autoriser l'utilisateur à choisir son préfixe (en place d'un préfixe xdc statique).

    On attend un fichier .xml contenant le document XML et un entête DOCTYPE suivant le modèle

    <?xml version="1.0"?>
    <!DOCTYPE texte [
    <!ENTITY % prefixe "xsd">
    ]>
    <html>
    ... 
    <html>

    et un fichier .dtd contenant la DTD.

    Changez le préfixe et vérifiez que le fichier valide toujours.

    CORRECTION. Le fichier .dtd doit contenir :

    <!ENTITY % prefixe "xdc">
    <!ENTITY % p_bookreview "%prefixe;:bookreview">
    <!ENTITY % p_title "%prefixe;:title">
    <!ENTITY % p_author "%prefixe;:author">
    <!ENTITY % p_price "%prefixe;:price">
    <!ENTITY % p_pages "%prefixe;:pages">
    <!ENTITY % p_date "%prefixe;:date">
    
    <!ENTITY % x_p "xmlns:%prefixe;">
    
    
    <!ELEMENT html (head,body)+>
    <!ELEMENT head (title)>
    <!ELEMENT body (%p_bookreview;)>
    <!ELEMENT %p_bookreview; (%p_title;,table)>
    <!ELEMENT table (tr)+>
    <!ELEMENT tr (td)+>
    <!ELEMENT td (#PCDATA | %p_author; | %p_price; | %p_pages; | %p_date;)*>
    <!ELEMENT title (#PCDATA)>
    <!ELEMENT %p_title; (#PCDATA)>
    <!ELEMENT %p_author; (#PCDATA)>
    <!ELEMENT %p_price; (#PCDATA)>
    <!ELEMENT %p_pages; (#PCDATA)>
    <!ELEMENT %p_date; (#PCDATA)>
    
    <!ATTLIST html xmlns CDATA #REQUIRED>
    <!ATTLIST html %x_p; CDATA #REQUIRED>
    <!ATTLIST tr align CDATA #IMPLIED>
    

    Note : il y a une subtilité que je n'ai pas signalés, qui est qu'une entité paramètre ne peut pas être appelée pour former un nom d'élément. Il faut en créer une séparément à chaque fois.