TP1 (avec correction), 23/09/2009

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

Les infos pour valider un fichier XML se trouvent ici.

  1. Reprendre les exemples du TD
  2. Transformez l'arbre suivant en document XML, et écrire une DTD qui valide le document. L' attribut “lang” est soit “fr” soit “en”. un arbre à transformer en document
    CORRECTION.
    book.xml :
    <?xml version=”1.0” encoding=”utf-8”?>
    <!DOCTYPE bookstore SYSTEM “book.dtd”>
    <bookstore>
    	<book category=”fiction”>
    		<title lang=”en”>Une brève histoire du temps</title>
    		<author>Stephen Hawking</author>
    		<year>1988</year>
    		<price>50,00 euros</price>
    	</book>
    </bookstore>
    
    book.dtd :
    <!ELEMENT bookstore (book*)>
    <!ELEMENT book (title, author, year, price)>
    <!ELEMENT title (#PCDATA)>
    <!ELEMENT author (#PCDATA)>
    <!ELEMENT year (#PCDATA)>
    <!ELEMENT price (#PCDATA)>
    <!ATTLIST book category CDATA #REQUIRED>
    <!ATTLIST title lang (en | fr) #IMPLIED>
    
  3. Corrigez le document XML si-dessous, pour qu' il soit bien formé :
    <CHAMPIONNAT DIVISION="1" SAISON="2003-2004">
    	<JOURNEE NUMERO="1" DATE="01/08/2003">
    		<RENCONTRE DOMICILE="Auxerre" EXTERIEUR="Nice" SCORED="1" SCOREE="2" RENCONTRE/>
    		<RENCONTRE DOMICILE="Guingamp" EXTERIEUR="Marseille" SCORED="0" SCOREE="1"/>
    		<RENCONTRE DOMICILE="Lens" EXTERIEUR="LeMans" SCORED="0" SCOREE="0"/>/<RENCONTRE>
    		<RENCONTRE DOMICILE="Lille" EXTERIEUR="Lyon" SCORED="1" SCOREE="0"/>
    		<RENCONTRE DOMICILE="Metz" EXTERIEUR="Ajaccio" SCOREE="0" SCOREE="1"/>
    		<RENCONTRE DOMICILE="Monaco" EXTERIEUR="Bordeaux" SCORED="2" SCOREE="0"/>
    		<RENCONTRE DOMICILE="Montpellier" EXTERIEUR="Rennes" SCORED="1" SCOREE="1">
    		<RENCONTRE DOMICILE="ParisSG" EXTERIEUR="Bastia" SCORED="0" SCOREE="0"/>
    		<RENCONTRE DOMICILE="Sochaux" EXTERIEUR="Nantes" SCORED="2" SCOREE="1"/>
    		<RENCONTRE DOMICILE="Toulouse" EXTERIEUR="Strasbourg" SCOED="1" SCOREE="1"/>
    
    	<JOURNEE NUMERO="2" DATE=08/08/2003>
    		<RENCONTRE DOMICILE="Bastia" EXTERIEUR="Metz" SCORED="0" SCOREE="2"/>
    		<RENCONTRE DOMICILE="Bordeaux" EXTERIEUR="Montpellier" SCORED="0" SCOREE="1"/>
    		<RENCONTRE DOMICILE="LeMans" EXTERIEUR="Ajaccio" SCORED="0" SCOREE="1"/>
    		<RENCONTRE DOMICILE="Lille" EXTERIEUR="ParisSG" SCORED="1" SCOREE="0"/>
    		<RENCONTRE DOMICILE="Lyon" EXTEREUR="Monaco" SCORED="3" SCOREE="1"/>
    		<RENCONTRE DOMICILE="Marseille" EXTERIEUR="Auxerre" SCORED="1" SCOREE="0"/>
    		<RENCONTRE DOMICILE="Nantes" EXTERIEUR="Lens" SCORED="2" SCOREE="0"/>
    		<RENCONTRE DOMICILE="Nice" EXTERIEUR="Sochaux" SCORED="1" SCOREE="0"/>
    		<RENCONTRE DOMICILE="Rennes" EXTERIEUR="Toulouse" SCORED="1" SCOREE="0"/>
    		<RENCONTRE DOMICILE="Strasbourg" EXTERIEUR="Guingamp" SCORED="2" SCOREE="0"/>
    	</journee>
    <CHAMPIONNAT NUMERO =”2”/>
    
    CORRECTION.
    <CHAMPIONNAT DIVISION="1" SAISON="2003-2004">
    	<JOURNEE NUMERO="1" DATE="01/08/2003">
    		<RENCONTRE DOMICILE="Auxerre" EXTERIEUR="Nice" SCORED="1" SCOREE="2"/>
    		<RENCONTRE DOMICILE="Guingamp" EXTERIEUR="Marseille" SCORED="0" SCOREE="1"/>
    		<RENCONTRE DOMICILE="Lens" EXTERIEUR="LeMans" SCORED="0" SCOREE="0"/>
    		<RENCONTRE DOMICILE="Lille" EXTERIEUR="Lyon" SCORED="1" SCOREE="0"/>
    		<RENCONTRE DOMICILE="Metz" EXTERIEUR="Ajaccio" SCORED="0" SCOREE="1"/>
    		<RENCONTRE DOMICILE="Monaco" EXTERIEUR="Bordeaux" SCORED="2" SCOREE="0"/>
    		<RENCONTRE DOMICILE="Montpellier" EXTERIEUR="Rennes" SCORED="1" SCOREE="1"/>
    		<RENCONTRE DOMICILE="ParisSG" EXTERIEUR="Bastia" SCORED="0" SCOREE="0"/>
    		<RENCONTRE DOMICILE="Sochaux" EXTERIEUR="Nantes" SCORED="2" SCOREE="1"/>
    		<RENCONTRE DOMICILE="Toulouse" EXTERIEUR="Strasbourg" SCORED="1" SCOREE="1"/>
    	</JOURNEE>
    
    	<JOURNEE NUMERO="2" DATE="08/08/2003">
    		<RENCONTRE DOMICILE="Bastia" EXTERIEUR="Metz" SCORED="0" SCOREE="2"/>
    		<RENCONTRE DOMICILE="Bordeaux" EXTERIEUR="Montpellier" SCORED="0" SCOREE="1"/>
    		<RENCONTRE DOMICILE="LeMans" EXTERIEUR="Ajaccio" SCORED="0" SCOREE="1"/>
    		<RENCONTRE DOMICILE="Lille" EXTERIEUR="ParisSG" SCORED="1" SCOREE="0"/>
    		<RENCONTRE DOMICILE="Lyon" EXTERIEUR="Monaco" SCORED="3" SCOREE="1"/>
    		<RENCONTRE DOMICILE="Marseille" EXTERIEUR="Auxerre" SCORED="1" SCOREE="0"/>
    		<RENCONTRE DOMICILE="Nantes" EXTERIEUR="Lens" SCORED="2" SCOREE="0"/>
    		<RENCONTRE DOMICILE="Nice" EXTERIEUR="Sochaux" SCORED="1" SCOREE="0"/>
    		<RENCONTRE DOMICILE="Rennes" EXTERIEUR="Toulouse" SCORED="1" SCOREE="0"/>
    		<RENCONTRE DOMICILE="Strasbourg" EXTERIEUR="Guingamp" SCORED="2" SCOREE="0"/>
    	</JOURNEE>
    </CHAMPIONNAT>
    
    
  4. Dans la première partie du document corrigé (journée numéro 1), transformez les attributs en éléments XML (il ne doit plus y avoir d'attributs qui apparaissent).
    CORRECTION.
    <CHAMPIONNAT DIVISION="1" SAISON="2003-2004">
    	<JOURNEE NUMERO="1" DATE="01/08/2003">
    		<RENCONTRE>
    			<DOMICILE>Auxerre</DOMICILE>
    			<EXTERIEUR>Nice</EXTERIEUR>
    			<SCORED>1</SCORED>
    			<SCOREE>2</SCOREE>			
    		</RENCONTRE>
    		<RENCONTRE>
    			<DOMICILE>Guingamp</DOMICILE>
    			<EXTERIEUR>Marseille</EXTERIEUR>
    			<SCORED>0</SCORED>
    			<SCOREE>1</SCOREE>
    		</RENCONTRE>
    		<RENCONTRE>
    			<DOMICILE>Lens</DOMICILE>
    			<EXTERIEUR>LeMans</EXTERIEUR>
    			<SCORED>0</SCORED>
    			<SCOREE>0</SCOREE>
    		</RENCONTRE>
    		<RENCONTRE>
    			<DOMICILE>Lille</DOMICILE>
    			<EXTERIEUR>Lyon</EXTERIEUR>
    			<SCORED>1</SCORED>
    			<SCOREE>0</SCOREE>
    		</RENCONTRE>
    		<RENCONTRE>
    			<DOMICILE>Metz</DOMICILE>
    			<EXTERIEUR>Ajaccio</EXTERIEUR>
    			<SCORED>0</SCORED>
    			<SCOREE>1</SCOREE>
    		</RENCONTRE>
    		<RENCONTRE>
    			<DOMICILE>Monaco</DOMICILE>
    			<EXTERIEUR>Bordeaux</EXTERIEUR>
    			<SCORED>2</SCORED>
    			<SCOREE>0</SCOREE>
    		</RENCONTRE>
    		<RENCONTRE>
    			<DOMICILE>Montpellier</DOMICILE>
    			<EXTERIEUR>Rennes</EXTERIEUR>
    			<SCORED>1</SCORED>
    			<SCOREE>1</SCOREE>
    		</RENCONTRE>
    		<RENCONTRE>
    			<DOMICILE>ParisSG</DOMICILE>
    			<EXTERIEUR>Bastia</EXTERIEUR>
    			<SCORED>0</SCORED>
    			<SCOREE>0</SCOREE>
    		</RENCONTRE>
    		<RENCONTRE>
    			<DOMICILE>Sochaux</DOMICILE>
    			<EXTERIEUR>Nantes</EXTERIEUR>
    			<SCORED>2</SCORED>
    			<SCOREE>1</SCOREE>
    		</RENCONTRE>
    		<RENCONTRE>
    			<DOMICILE>Toulouse</DOMICILE>
    			<EXTERIEUR>Strasbourg</EXTERIEUR>
    			<SCORED>1</SCORED>
    			<SCOREE>1</SCOREE>
    		</RENCONTRE>
    	</JOURNEE>
    </CHAMPIONNAT>
    
    
  5. Corrigez le DTD suivant qui correspond au document XML de la question 3:
    <!ELEMENT CHAMPIONNAT (JOURNEE)>
    <!ELEMENT JOURNEE (RENCONTRE+)>
    <!ELEMENT recontre  EMPTY>
    
    <!ATTLIST CHAMPIONNAT DIVISION CDATA #REQUIRED
                          SAISON   CDATA #REQUIRED
    >
    
    <!ATTLIST JOURNEE NUMERO CDATA #REQUIRED
                      DATE   CDATA #REQUIRED
    >
    
    <!ATTLIST RENCONTRE DOMICILE  CDATA #REQUIRED
                        EXTERIEUR CDATA 
                        SCORED    CDATA #REQUIRED
                        SCOREE    CDATA #REQUIRED
    >
    
    CORRECTION.
    <!ELEMENT CHAMPIONNAT (JOURNEE+)>
    <!ELEMENT JOURNEE (RENCONTRE+)>
    <!ELEMENT RENCONTRE EMPTY>
    
    <!ATTLIST CHAMPIONNAT DIVISION CDATA #REQUIRED
                          SAISON   CDATA #REQUIRED
    >
    
    <!ATTLIST JOURNEE NUMERO CDATA #REQUIRED
                      DATE   CDATA #REQUIRED
    >
    
    <!ATTLIST RENCONTRE DOMICILE  CDATA #REQUIRED
                        EXTERIEUR CDATA #REQUIRED
                        SCORED    CDATA #REQUIRED
                        SCOREE    CDATA #REQUIRED
    >
    
    
  6. Modélisation de films de cinéma.
    1. Proposer une DTD qui permette de décrire plusieurs films dans un même fichier XML. La base de données comporte, au même niveau : Une liste d'acteurs, chacun avec leur nom et un ID. Une liste de films. Pour chaques film, un attribut permettra de préciser sa langue d'origine (dans une liste prédéfinie). En outre, on pourra préciser une photo, le titre du film, l'année, le réalisateur, le casting, le synopsis éventuellement. Le casting est une suite de personnages, chacun associé à l'ID de l'acteur correspondant.
      CORRECTION.
      <!-- une liste de films -->
      <!ELEMENT films (acteur+, film+)>
      
      <!-- description d'un acteur -->
      <!ELEMENT acteur (#PCDATA)>
      <!ATTLIST acteur  id ID #REQUIRED>
      
      <!-- description d'un film -->
      <!ELEMENT film (photo?,titre,annee,realisateur,casting,synopsis?)>
      
      <!-- langue utitilisé dans la fiche du film -->
      <!ATTLIST film lang (fr|en) #REQUIRED>
      
      <!-- photo du film-->
      <!ELEMENT photo EMPTY>
      <!ATTLIST photo href CDATA #REQUIRED>
      
      <!-- le casting -->
      <!ELEMENT casting (personnage*)>
      
      <!-- un personnage : son nom et son personnage -->
      <!ELEMENT personnage (#PCDATA)>
      <!ATTLIST personnage  acteur IDREF #IMPLIED>
      
      
      <!ELEMENT perso EMPTY>
      <!ATTLIST perso ref IDREF #REQUIRED>
      
      <!-- les autres descripteurs du film -->
      <!ELEMENT titre (#PCDATA)>
      <!ELEMENT annee (#PCDATA)>
      <!ELEMENT realisateur (#PCDATA)>
      
      
    2. Utilisez les donnée si-dessous pour écrire un document XML qui satifait le DTD précédant.
      Premier film:
      Il s'appele Rocky, il est en Anglais, sa photo se trouve dans le fichier: rocky.jpg. Ce film est sorti durant l'année 1976, réalisé par John G. Avildsen. Les personnages pricipaux de ce film sont:
      Sylvester Stallone qui joue Rocky Balboa; Talia Shire qui joue Adrian; Burt Young qui joue Paulie; Carl Weathers qui joue Apollo Creed; Burgess Meredith qui joue Mickey.
      Deuxième film:
      Il s'appelle La Guerre des étoiles, il est en Francais, sa photo n'est pas disponible. Ce film est sorti durant l'année 1977, du réalisateur George Lucas. Les personnages pricipaux de ce film sont:
      Mark Hamill qui joue Luke Skywalker; Harrison Ford qui joue Han Solo; Carrie Fisher qui joue La princesse Leia.
      Troisième film:
      Il s'appelle Raiders of the Lost Ark, il est en Anglais, sa photo se trouve dans le fichier indiana.jpg. Ce film est sorti en 1981, par le rélalisateur Steven Spielberg. Les personnages pricipaux de ce film sont:
      Harrison Ford qui joue Indiana Jones.
      CORRECTION.
      <?xml version="1.0"?>
      <!DOCTYPE films SYSTEM "films.dtd">
      <films>
      	<acteur id="stallone">Sylvester Stallone</acteur>
      	<acteur id="shire">Talia Shire</acteur>
      	<acteur id="young">Burt Young</acteur>
      	<acteur id="weather">Carl Weathers</acteur>
      	<acteur id="meredith">Burgess Meredith</acteur>
      	<acteur id="hamill">Mark Hamill</acteur>
      	<acteur id="ford">Harrison Ford</acteur>
      	<acteur id="fisher">Carrie Fisher</acteur>
      
      	<!-- ROCKY -->
      	 <film lang="en">
      	       <photo href="rocky.jpg"/>
      		<titre>Rocky</titre>
      		<annee>1976</annee>
      		<realisateur>John G. Avildsen</realisateur>
      		<casting>
      			<personnage acteur="stallone">Rocky Balboa</personnage>
      			<personnage acteur="shire">Adrian</personnage>
      			<personnage acteur="young">Paulie</personnage>
      			<personnage acteur="weather">Apollo Creed</personnage>
      			<personnage acteur="meredith">Mickey</personnage>
      		</casting>
      	</film>
      
      	<!-- Star Wars épisode 4 -->
      	<film lang="fr">
      		<titre>La Guerre des étoiles</titre>
      		<annee>1977</annee>
      		<realisateur>George Lucas</realisateur>
      		<casting>
      			<personnage acteur="hamill">Luke Skywalker</personnage>
      			<personnage acteur="ford">Han Solo</personnage>
      			<personnage acteur="fisher">La princesse Leia</personnage>
      		</casting>
      	</film>
      
      	<!-- le premier Indiana Jones -->
      	<film lang="en">
      		<titre>Raiders of the Lost Ark</titre>
      		<annee>1981</annee>
      		<realisateur>Steven Spielberg</realisateur>
      		<casting>
      			<personnage acteur="ford">Indiana Jones</personnage>
      		</casting>
      	</film>
      	
      </films>
      
      
    3. Dessinez l'arbre qui correspond juste au 2eme film, avec pour racine films.
      CORRECTION.
      arbre correspondant au deuxième film