Valid XHTML     Valid CSS2    

Listing du fichier l2xml_6_tp3.php

 

00001     <?php
00002     #   # (gH)   -_-  l2xml_6_tp3.php  ;  TimeStamp (unix) : 30 Novembre 2017 vers 17:34
00003     include(
"std.php") ;
00004     include("l2xml_6_inc.php"
) ;
00005     
00006     $HTML  
s_span("HTML" ,"grouge") ;
00007     $XHTML 
s_span("XHTML","grouge") ;
00008     $XML   
s_span("XML"  ,"grouge") ;
00009     $DTD   
s_span("DTD"  ,"grouge") ;
00010     $XSD   
s_span("XSD"  ,"grouge") ;
00011     $SVG   
s_span("SVG"  ,"grouge") ;
00012     $XSL   
s_span("XSL"  ,"grouge") ;
00013     $CSS   
s_span("CSS"  ,"grouge") ;
00014     $JavaScript 
s_span("JavaScript"  ,"grouge") ;
00015     
00016     $rxp        
ghRouge("rxp") ;
00017     $xmllint    
ghRouge("xmllint") ;
00018     $xmlstarlet 
ghRouge("xmlstarlet") ;
00019     
00020     $numSerie 
;
00021     
00022     if (!isset($_GET
["standalone"])) { debutPage("XML en L2, TP $numSerie","strict","","l2xml.js") ; } ;
00023     
00024     debutSection
() ;
00025     if (isset($_GET
["standalone"])) { jsf("l2xml.js") ; } ;
00026     h1
("$XML en L2, université d'Angers ") ;
00027     h2
(s_nbsp(4).href("../../","gilles.hunault@univ-angers.fr","gvert nou")) ;
00028     pvide
() ;
00029     h2
("T.P. numéro 3","gbleu") ;
00030     pvide
() ;
00031     
00032     ###########################################################################################
00033     
00034     $tableauDesRubriques 
= array() ;
00035     $idr 
;
00036     $idr
++; $tableauDesRubriques[$idr] = "Créer un document $XML qui respecte une grammaire $DTD;
00037     $idr
++; $tableauDesRubriques[$idr] = "Créer un document $XML qui respecte une grammaire $XSD;
00038     $idr
++; $tableauDesRubriques[$idr] = "DTD et paramètres" ;
00039     $idr
++; $tableauDesRubriques[$idr] = "Validité suivant la grammaire" ;
00040     $idr
++; $tableauDesRubriques[$idr] = "Créer des grammaires $DTD et $XSD;
00041     $idr
++; $tableauDesRubriques[$idr] = "Non unicité des grammaires $DTD et $XSD;
00042     $idr
++; $tableauDesRubriques[$idr] = "Vérification des vérificateurs" ;
00043     $idr
++; $tableauDesRubriques[$idr] = "Rajout de contraintes" ;
00044     $tdmCRLM 
= new tdm($tableauDesRubriques) ;
00045     $tdmCRLM
->titre() ;
00046     $tdmCRLM
->menu("oui","oui","nou") ;
00047     
00048     pvide
() ;
00049     
00050     $numExo   
;
00051     direAfficherSolutions
($numSerie) ;
00052     pvide
() ;
00053     
00054     ## -------------------------------------------------------------------------------------------
00055     
00056     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # . Créer un document qui respecte une grammaire DTD
00057     
00058     ## -------------------------------------------------------------------------------------------
00059     
00060     blockquote
() ;
00061     
00062     p
("texte") ;
00063     echo " Nous admettrons pour ce qui suit qu'une molécule est définie par une liste " 
;
00064     echo " d'atomes avec le nom des atomes, leur notation et le nombre de ces atomes fournis en attributs. " 
;
00065     echo " Par exemple la molécule d'eau "
.b("H".sub("2")."O")." est définie par l'atome de nom hydrogène, de notation H en nombre 2 " ;
00066     echo " et par l'atome de nom oxygène, de notation O et en nombre 1 (qui peut donc être omis)." 
;
00067     echo " Après avoir lu soigneusement le fichier suivant nommé "
.href("molecule_dtd.txt","molecule.dtd").", écrire un fichier ".b("eau.xml") ;
00068     echo " valide pour cette grammaire 
$DTD. On utilisera un outil en ligne de commande pour vérifier cette validité. " ;
00069     echo " On pourra ignorer les accents. " 
;
00070     finp
() ;
00071     
00072     p
() ;
00073     echo b
("Fichier molecule.dtd&nbsp;:") ;
00074     finp
() ;
00075     
00076     pre_fichier
("molecule.dtd","cadre") ;
00077     
00078     p
("texte") ;
00079     echo "Est-ce que cette grammaire 
$DTD autorise les chaines vides pour les noms, lettres et nombres&nbsp;?" ;
00080     finp
() ;
00081     
00082     p
("texte") ;
00083     echo "Est-ce qu'il faut respecter l'ordre des attributs tel qu'il est défini dans la grammaire 
$DTD&nbsp;?" ;
00084     finp
() ;
00085     
00086     solution
($numExo,$numSerie) ;
00087     
00088     p
("texte") ;
00089     echo "Voici un fichier "
.href("eau.xml")." possible&nbsp;:" ;
00090     finp
() ;
00091     
00092     pre_fichier
("eau.xml","cadrebleu") ;
00093     
00094     p
("texte") ;
00095     echo "On peut vérifier la validité de ce fichier pour la grammaire "
.href("molecule_dtd.txt","molecule.dtd")." via les commandes suivantes&nbsp;:" ;
00096     finp
() ;
00097     
00098     pre_fichier
("molecule_sh1.txt","cadrejaune") ;
00099     
00100     p
("texte") ;
00101     echo "Hélas, oui cette grammaire 
$DTD autorise les chaines vides pour les noms, lettres et " ;
00102     echo " les nombres car "
.b("CDATA").", comme ".b("#PCDATA")." inclut la chaine vide. " ;
00103     echo " On pourra s'en rendre compte avec le fichier suivant "
.href("eauvide.xml")." qui est " ;
00104     echo " valide pour cette grammaire. Attention : une chaine de caractères réduite à un espace " 
;
00105     echo " est aussi valide, mais vraiment peu informative..." 
;
00106     finp
() ;
00107     
00108     p
("texte") ;
00109     echo "De la même façon, l'ordre des attributs est libre, à condition qu'un attribut n'apparaisse pas deux fois, " 
;
00110     echo " comme le montre le fichier suivant, qui est valide pour la 
$DTD considérée&nbsp;:" ;
00111     finp
() ;
00112     
00113     p
() ;
00114     echo b
("Fichier ".href("eaudtdatt.xml")."&nbsp;:") ;
00115     finp
() ;
00116     
00117     pre_fichier
("eaudtdatt.xml","cadre") ;
00118     
00119     p
("texte") ;
00120     echo "Voici le message d'erreur en cas de duplication d'attribut, comme " 
;
00121     echo " c'est le cas pour le fichier "
.href("eaudtdatt2.xml")."&nbsp;:" ;
00122     finp
() ;
00123     
00124     pre_fichier
("eaudtdatt2.xml","cadrejaune") ;
00125     
00126     pre_fichier
("eaudtdatt2.txt","cadrebleu") ;
00127     
00128     finsolution
() ;
00129     
00130     finblockquote
() ;
00131     
00132     ## -------------------------------------------------------------------------------------------
00133     
00134     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # . Créer un document qui respecte une grammaire XSD
00135     
00136     ## -------------------------------------------------------------------------------------------
00137     
00138     blockquote
() ;
00139     
00140     p
("texte") ;
00141     echo " On décide maintenant d'utiliser la grammaire "
.href("molecule_xsd.txt","molecule.xsd")." suivante pour stocker les mêmes informations." ;
00142     finp
() ;
00143     
00144     p
() ;
00145     echo b
("Fichier molecule.xsd&nbsp;:") ;
00146     finp
() ;
00147     
00148     pre_fichier
("molecule.xsd","cadre") ;
00149     
00150     p
("texte") ;
00151     echo " Ecrire un fichier "
.b("eau2.xml") ;
00152     echo " valide pour cette grammaire 
$XSD. On utilisera un outil en ligne de commande pour vérifier cette validité." ;
00153     echo " Là encore, on pourra ignorer les accents. " 
;
00154     finp
() ;
00155     
00156     p
("texte") ;
00157     echo "Est-ce que cette grammaire 
$XSD autorise les chaines vides pour les noms, lettres et nombres&nbsp;?" ;
00158     finp
() ;
00159     
00160     solution
($numExo,$numSerie) ;
00161     
00162     p
("texte") ;
00163     echo "Voici un fichier "
.href("eau2.xml")." possible&nbsp;:" ;
00164     finp
() ;
00165     
00166     pre_fichier
("eau2.xml","cadrebleu") ;
00167     
00168     p
("texte") ;
00169     echo "On peut vérifier la validité de ce fichier pour la grammaire "
.href("molecule_xsd.txt","molecule.xsd")." via les commandes suivantes&nbsp;:" ;
00170     finp
() ;
00171     
00172     pre_fichier
("molecule_sh2.txt","cadrejaune") ;
00173     
00174     p
("texte") ;
00175     echo "Hélas, oui cette grammaire 
$XSD autorise les chaines vides pour les noms, lettres, mais pas " ;
00176     echo " pour les nombres car "
.b("xsd:string")." inclut la chaine vide mais ".b("xsd:integer")." l'interdit. " ;
00177     echo " On pourra s'en rendre compte avec le fichier suivant "
.href("eau3.xml")." qui est " ;
00178     echo " valide pour cette grammaire. Attention&nbsp;: ici aussi une chaine de caractères réduite à un espace " 
;
00179     echo " est valide, mais vraiment peu informative..." 
;
00180     finp
() ;
00181     
00182     finsolution
() ;
00183     
00184     finblockquote
() ;
00185     
00186     ## -------------------------------------------------------------------------------------------
00187     
00188     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # . DTD et paramètres
00189     
00190     ## -------------------------------------------------------------------------------------------
00191     
00192     blockquote
() ;
00193     
00194     p
("texte") ;
00195     echo "On structure un "
.ghBleu("dessin 2D")." élémentaire selon les règles suivantes. " ;
00196     echo " Un dessin est un cercle, un rectangle ou un triangle. " 
;
00197     echo " Un cercle est défini par un centre et un rayon, " 
;
00198     echo " un rectangle par son "
.em("csg")." (coin supérieur gauche), une longueur et une largeur, " ;
00199     echo " un triangle par trois points. " 
;
00200     echo " Chaque élément graphique peut avoir une couleur parmi les mots prédéfinis bleu, rouge, jaune ou vert. " 
;
00201     echo " Ecrire un fichier "
.b("dessin.xml")." qui dans un " ;
00202     echo   href
(wikien("Viewport"),"viewport")." bleu de 500 pixels de large et 300 de haut, met un \"soleil\" jaune de rayon 15 pixels en (450,50), " ;
00203     echo " une plage rectangulaire verte qui fait toute la largeur et qui fait 100 pixels de haut. " 
;
00204     echo " Pour les plus fort(e)s, rajouter une petite étoile de mer rouge en bas à gauche à l'aide de trois triangles bien choisis. " 
;
00205     echo " A défaut, on placera juste un triangle plein et en rouge. " 
;
00206     echo " On pourra s'inspirer du dessin ci-dessous et de la syntaxe "
.href("http://www.w3.org/Graphics/SVG/IG/resources/svgprimer.html#examples","SVG")."." ;
00207     finp
() ;
00208     
00209     p
() ;
00210     nbsp
(30) ;
00211     echo href
("dessin2.png",img("dessin2.png","",200)) ;
00212     finp
() ;
00213     
00214     p
("texte") ;
00215     echo " Ecrire ensuite la \"vraie\" version en 
$SVG de ce dessin. " ;
00216     finp
() ;
00217     
00218     p
("texte") ;
00219     echo " Comment vérifier que ce dessin est valide au sens de la grammaire de 
$SVG&nbsp;?" ;
00220     finp
() ;
00221     
00222     p
("texte") ;
00223     echo " Quel logiciel, du type paint, gimp ou photoshop, permet de lire et d'écrire des fichiers 
$SVG&nbsp;?" ;
00224     finp
() ;
00225     
00226     p
("texte") ;
00227     echo "Donner les grammaires "
.ghRouge("DTD")." et ".ghRouge("XSD")." associées au fichier " ;
00228     echo href
("dessinTP.xml").". " ;
00229     echo "On nommera "
.b("dessin.dtd")." et ".b("dessin.xsd")." les fichiers-grammaires correspondants. " ;
00230     echo " On essaiera de paramétrer l'attribut couleur qui est commun. " 
;
00231     finp
() ;
00232     
00233     solution
($numExo,$numSerie) ;
00234     
00235     p
("texte") ;
00236     echo "Voici un fichier 
$XML possible pour le dessin avec une syntaxe en français adaptée de SVG, nommé ".href("dessin.xml") ;
00237     finp
() ;
00238     
00239     pre_fichier
("dessin.xml","cadre") ;
00240     
00241     p
("texte") ;
00242     echo "La \"vraie\" version dont un rendu est dans "
.href("dessin1.svg","dessin1.svg")." est la suivante " ;
00243     finp
() ;
00244     
00245     pre_fichier
("dessin1.svg","cadrebleu") ;
00246     
00247     p
("texte") ;
00248     echo "Et pour le dessin avec l'étoile "
.href("dessin2.svg","dessin2.svg")." on peut utiliser " ;
00249     finp
() ;
00250     
00251     pre_fichier
("dessin2.svg","cadrejaune") ;
00252     
00253     p
("texte") ;
00254     echo "Le W3C avec son fameux "
.href("https://validator.w3.org/","Markup Validation Service")." est capable de tester si ce fichier est valide " ;
00255     echo " pour la grammaire de 
$SVG." ;
00256     finp
() ;
00257     
00258     p
("texte") ;
00259     echo "Au niveau logiciel, c'est sans doute "
.href("https://inkscape.org/fr/","Inkscape")." qui est le plus complet et le plus agréale à utiliser " ;
00260     echo " pour dessiner, lire et écrire des images au format 
$SVG." ;
00261     finp
() ;
00262     
00263     blockquote
() ;
00264     table
(1,15,"collapse") ;
00265       tr
() ;
00266         td
() ; echo "Rendu SVG (si le browser le permet)" fintd() ;
00267         td
() ; echo "<object data='dessin1.svg' width='500' />\n" fintd() ;
00268         td
() ; echo "<object data='dessin2.svg' width='500' />\n" fintd() ;
00269       fintr
() ;
00270       tr
() ;
00271         td
() ; echo "Rendu PNG (copie d'écran)" fintd() ;
00272         td
() ; echo img("dessin1.png","dessin1","500") ; fintd() ;
00273         td
() ; echo img("dessin2.png","dessin2","500") ; fintd() ;
00274       fintr
() ;
00275     fintable
() ;
00276     finblockquote
() ;
00277     
00278     p
("texte") ;
00279     echo "Là encore, pour "
.href("dessin.xml").", il y a peu d'éléments et d'attributs dans ".href("dessin.xml")." donc une grammaire ".ghBleu("DTD") ;
00280     echo " &laquo;vite fait&raquo; peut &ecirc;tre "
.href("dessin.dtd")." dont le contenu est&nbsp;:" ;
00281     finp
() ;
00282     
00283     pre_fichier
("dessin.dtd","cadre",0,1) ;
00284     
00285     p
("texte") ;
00286     echo "Pour forcer les couleurs à ne prendre que les valeurs autorisées, on peut utiliser une liste de valeurs, soit&nbsp;:" 
;
00287     finp
() ;
00288     
00289     pre_fichier
("dessin2.dtd","cadre") ;
00290     p
("texte") ;
00291     echo "Pour éviter la duplication par copier/coller de cette liste des couleurs, le mieux est d'utiliser une entité paramétrique, qui fonctionne " 
;
00292     echo " comme une entité "
.b("HTML")." mais qui commence par le symbole ".b("%")." (pourcent)&nbsp;:" ;
00293     echo "" 
;
00294     finp
() ;
00295     
00296     pre_fichier
("dessin3.dtd","cadre") ;
00297     
00298     p
("texte") ;
00299     echo "On peut aller encore plus loin et intégrer la couleur par défaut dans l'entité ou décider qu'il est plus " 
;
00300     echo " modulaire de définir une autre entité pour la couleur par défaut&nbsp;" 
;
00301     finp
() ;
00302     
00303     pre_fichier
("dtdt4et5.txt","cadrebleu") ;
00304     
00305     p
("texte") ;
00306     echo "Voici donc les 5 grammaires 
$DTD possibles et leur traduction automatique en schéma $XSD&nbsp;:" ;
00307     finp
() ;
00308     
00309     blockquote
() ;
00310     $listeDtd4 
listeFichiers("dessin",1,5,"dtd") ;
00311     $listeXsd4 
listeFichiers("dessin",1,5,"xsd") ;
00312     $liste4    
"$listeDtd4 <p> $listeXsd4;
00313     montreListeFichiers
($liste4,"visuListe5",20) ;
00314     finblockquote
() ;
00315     
00316     finsolution
() ;
00317     
00318     finblockquote
() ;
00319     
00320     ## -------------------------------------------------------------------------------------------
00321     
00322     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # .  Validité suivant la grammaire
00323     
00324     ## -------------------------------------------------------------------------------------------
00325     
00326     blockquote
() ;
00327     
00328     p
("texte") ;
00329     echo "Ecrire un fichier minimal "
.b("ouimaisnon.xml")." qui est valide pour la grammaire ".href("g1.dtd")."  mais " ;
00330     echo " non valide pour la grammaire "
.href("g2.dtd").". " ;
00331     echo " Fournir ensuite un fichier "
.b("livre.xml")." valide pour ".href("g2.dtd").". " ;
00332     finp
() ;
00333     
00334     solution
($numExo,$numSerie) ;
00335     
00336     p
("texte") ;
00337     echo "Il ne faut pas se laisser impressionner par la longueur de la grammaire "
.href("g1.dtd")." car de nombreux de ses éléments sont facultatifs&nbsp;:" ;
00338     finp
() ;
00339     
00340     pre_fichier
("g1.dtd","cadrejaune") ;
00341     
00342     p
("texte") ;
00343     echo "Donc si on se focalise sur les éléments obligatoires, on peut se limiter à un fichier "
.href("ouimaisnon.xml")." comme celui-ci&nbsp;:" ;
00344     finp
() ;
00345     
00346     pre_fichier
("ouimaisnon.xml","cadre") ;
00347     
00348     p
("texte") ;
00349     echo "On notera au passage ce que permet le mot clé "
.b("ANY")." pour l'élément ".ghBleu("references").", qui, s'il permet de tester des documents en cours " ;
00350     echo " de rédaction, n'est pas très contraignant. De m&ecirc;me en ce qui concerne "
.b("(#PCDATA|chapitre)*")." pour l'élément ".ghBleu("chapitres").". " ;
00351     echo " Pour vérifier que ce fichier est valide pour g1 mais non pour g2, le plus simple est d'utiliser 
$xmlstarlet " ;
00352     echo " ou 
$xmllint car on n'a pas besoin d'écrire " ;
00353     echo " explicitement "
.ghVert("&lt;!DOCTYPE")." avant l'élément racine, ce que ne permet pas $rxp&nbsp;:" ;
00354     finp
() ;
00355     
00356     pre_fichier
("ouimaisnon_validation.txt","cadre") ;
00357     
00358     p
("texte") ;
00359     echo "Par contre, la grammaire "
.href("g2.dtd")." est plus exigeante que la grammaire ".href("g1.dtd")."&nbsp;:" ;
00360     finp
() ;
00361     
00362     pre_fichier
("g2.dtd","cadrejaune") ;
00363     
00364     p
("texte") ;
00365     echo "Donc un fichier "
.href("livre.xml")." valide pour g2 est un peu plus technique et demande un peu plus de réflexion&nbsp;:" ;
00366     finp
() ;
00367     
00368     pre_fichier
("livre.xml","cadre") ;
00369     
00370     /* à compléter
00371     p("texte") ;
00372     echo "On remarquera que... " ;
00373     finp() ;
00374     */
00375     
00376     p
("texte") ;
00377     echo "Afin de vous entrainer à la lecture synoptique et comparative de 
$DTD et $XSD, voici donc les 2 grammaires $DTD possibes et leur traduction automatique en schéma $XSD&nbsp;:" ;
00378     finp
() ;
00379     
00380     blockquote
() ;
00381     $listeDtd6 
listeFichiers("g",1,2,"dtd") ;
00382     $listeXsd6 
listeFichiers("g",1,2,"xsd") ;
00383     $liste6    
"$listeDtd6 $listeXsd6;
00384     montreListeFichiers
($liste6,"visuListe6",20) ;
00385     finblockquote
() ;
00386     
00387     finsolution
() ;
00388     
00389     finblockquote
() ;
00390     
00391     ## -------------------------------------------------------------------------------------------
00392     
00393     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # . Créer des grammaires DTD et XSD"
00394     
00395     ## -------------------------------------------------------------------------------------------
00396     
00397     blockquote
() ;
00398     
00399     p
("texte") ;
00400     echo " Disons qu'un trajet ferroviaire est représenté schématiquement " 
;
00401     echo " mais obligatoirement par un numéro identifiant de trajet, un type de train, un lieu de départ et un lieu d'arrivée. " 
;
00402     echo " Ces informations sont éventuellement complétées, lorsqu'elles sont disponibles, par deux informations "
.b("ts")." (pour ".em("time stamp")." en anglais) " ;
00403     echo " qui fournissent respectivement la date et heure de départ et la date et heure d'arrivée. " 
;
00404     finp
() ;
00405     
00406     p
("texte") ;
00407     echo " Voici un exemple de fichier 
$XML regroupant deux trajets, nommé ".href("trajets.xml")."." ;
00408     finp
() ;
00409     
00410     p
() ;
00411     echo b
("Fichier trajets.xml&nbsp;:") ;
00412     finp
() ;
00413     
00414     pre_fichier
("trajets.xml","cadre") ;
00415     
00416     p
("texte") ;
00417     echo " Donner pour ce fichier "
.b("trajets.xml") ;
00418     echo " une grammaire 
$DTD ".em("minimale et raisonnable") ;
00419     echo " qui permet de décrire les trajets ferroviaires puis une grammaire 
$XSD équivalente." ;
00420     finp
() ;
00421     
00422     solution
($numExo,$numSerie) ;
00423     
00424     p
("texte") ;
00425     echo " On lira attentivement les fichiers ci-dessous. " 
;
00426     finp
() ;
00427     
00428     p
() ;
00429     echo b
("Grammaire trajets.dtd&nbsp;:") ;
00430     finp
() ;
00431     
00432     pre_fichier
("trajets.dtd","cadrejaune") ;
00433     
00434     p
() ;
00435     echo b
("Grammaire trajets.xsd&nbsp;:") ;
00436     finp
() ;
00437     
00438     pre_fichier
("trajets.xsd","cadrebleu") ;
00439     
00440     
00441     p
("texte") ;
00442     echo "Au passage, vous aurez remarqué que la grammaire proposée est invalide puisque l'espace de noms proposé (xs) " 
;
00443     echo " ne correspond pas aux préfixes utilisés (xsd). Il faut donc juste modifier la ligne 1 pour qu'il y ait écrit " 
;
00444     echo b
("xmlns:xsd=")." au lieu de " ;
00445     echo b
("xmlns:xs=").". " ;
00446     finp
() ;
00447     
00448     finsolution
() ;
00449     
00450     finblockquote
() ;
00451     
00452     ## -------------------------------------------------------------------------------------------
00453     
00454     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # .     Non unicité des grammaires DTD et XSD
00455     
00456     ## -------------------------------------------------------------------------------------------
00457     
00458     blockquote
() ;
00459     
00460     p
("texte") ;
00461     echo "Ecrire une grammaire pour le fichier "
.href("films2.xml","films2")." en ".ghRouge("DTD")." puis en ".ghRouge("XSD").". " ;
00462     echo " Où y a-t-il des choix à faire&nbsp;?" 
;
00463     echo " Pourquoi ne peut-on pas parler de "
.b("la")." grammaire ".ghRouge("DTD")." d'un fichier&nbsp;?" ;
00464     finp
() ;
00465     
00466     p
("texte") ;
00467     echo " Peut-on créer automatiquement des grammaires à partir d'exemples&nbsp;?" 
;
00468     echo " Que faut-il attendre de ce genre de production automatique&nbsp;?" 
;
00469     finp
() ;
00470     
00471     solution
($numExo,$numSerie) ;
00472     
00473     p
("texte") ;
00474     echo "La grammaire pour "
.href("films2.xml")." est un peu compliquée à écrire. " ;
00475     echo " D'abord parce qu'il y a une hiérarchie un peu moins évidente. Ensuite, parce que certains éléments ne sont pas renseignés, ce qui n'est pas " 
;
00476     echo " très facile à détecter car les éléments absents ne le sont pas en début de fichier&nbsp;: certains films n'ont pas d'élément GENRE et " 
;
00477     echo " certains films n'ont pas d'élément RESUME, certains artistes n'ont pas d'élément ANNEENAISS. " 
;
00478     finp
() ;
00479     
00480     p
("texte") ;
00481     echo "On pourrait éventuellement avoir une idée de la concomittance entre éléments et attributs " 
;
00482     echo " à l'aide notre programme "
.href("../eltatt.php","eltatt") ;
00483     echo " si on l'applique à "
.b("films5.xml")." soit le " ;
00484     echo href
("../eltattres.php?url=http://forge.info.univ-angers.fr/~gh/Webrd/films5.xml","résultat suivant").". " ;
00485     finp
() ;
00486     
00487     p
("texte") ;
00488     echo " On peut donc écrire la grammaire minimale suivante qui autorise à n'avoir aucun film ni aucun " 
;
00489     echo " artiste&nbsp;:" 
;
00490     echo " " 
;
00491     finp
() ;
00492     
00493     pre_fichier
("films2.dtd","cadrejaune") ;
00494     
00495     p
("texte") ;
00496     echo "Il n'est pas possible de profiter directement des déclarations "
.ghVert("ID")." et ".ghVert("IDREF")." des $DTD car dans la norme $XML un identifiant ou une référence " ;
00497     echo " à un identifiant ne peut pas &ecirc;tre uniquement numérique (de façon plus précise, il ne doit pas "
.b("commencer")." par un chiffre). Or, c'est " ;
00498     echo " souvent le cas lorsque l'attribut provient d'un champ autoincrémenté d'une base de données. Voici ce qui se passe si on essaie de valider&nbsp;:" 
;
00499     finp
() ;
00500     
00501     pre_fichier
("valide_id.txt","cadre") ;
00502     
00503     p
("texte") ;
00504     echo " Si on modifie le fichier des films en ajoutant " 
;
00505     echo " les 3 lettres art devant chaque identifiant et chaque référence d'identifiant, soit&nbsp;:" 
;
00506     finp
() ;
00507     
00508     pre_fichier
("filmsids.txt","cadrebleu") ;
00509     
00510     p
("texte") ;
00511     echo " alors, on peut utiliser "
.ghVert("ID")." et ".ghVert("IDREF")." comme suit&nbsp;:" ;
00512     finp
() ;
00513     
00514     pre_fichier
("films3.dtd","cadre") ;
00515     
00516     p
("texte") ;
00517     echo " Voici par exemple les messages d'erreur si on oublie de fournir un identifiant, si on définit deux fois le m&ecirc;me identifiant " 
;
00518     echo " ou si on fait référence à un identifiant qui n'existe pas " 
;
00519     echo "(nous avons mis art3333 au lieu de art3 comme référence pour le premier film)&nbsp;:" 
;
00520     finp
() ;
00521     
00522     pre_fichier
("films3erreurs.txt","cadrejaune") ;
00523     
00524     p
("texte") ;
00525     echo " Nous verrons dans la prochaine série d'exercices, avec les transformations 
$XSL, comment ajouter automatiquement les trois lettres ".ghBleu("art")." pour " ;
00526     echo "les attributs "
.b("id")." et ".b("idfref").", m&ecirc;me si on peut le faire sous éditeur avec ".b("Edition/Remplacer&nbsp;tout") ;
00527     echo " ou avec un outil en ligne de commande comme "
.b("sed")." ou ".b("perl")." en mode ".b("-i -e")."." ;
00528     finp
() ;
00529     
00530     p
("texte") ;
00531     echo " Il est clair qu'on ne peut pas parler de la grammaire d'un fichier 
$XML, m&ecirc;me si on précise $DTD ou $XSD " ;
00532     echo " car les exemples précécents montrent qu'on peut définir plusieurs grammaires pour lesquelles un m&ecirc;me fichier 
$XML est valide. " ;
00533     echo " C'est pourquoi on ne doit jamais dire qu'un fichier fichier 
$XML est valide sans préciser la grammaire utilisée alors qu'il est " ;
00534     echo " tout-à-fait normal de dire qu'un fichier est bien formé sans rien préciser d'autre. " 
;
00535     finp
() ;
00536     
00537     p
("texte") ;
00538     echo "Voici les grammaires utilisées&nbsp;:" 
;
00539     finp
() ;
00540     
00541     blockquote
() ;
00542     $listeDtd7 
listeFichiers("films",2,3,"dtd") ;
00543     $listeXsd7 
listeFichiers("films",2,3,"xsd") ;
00544     $liste7    
"$listeDtd7 $listeXsd7;
00545     montreListeFichiers
($liste7,"visuListe7",20) ;
00546     finblockquote
() ;
00547     
00548     p
("texte") ;
00549     echo "Il existe des outils pour créer automatiquement des grammaires à partir d'exemples, comme par exemple " 
;
00550     echo href
("http://www.thaiopensource.com/relaxng/trang.html","trang","grouge")." " ;
00551     echo " dont le manuel est "
.href(" https://relaxng.org/jclark/trang-manual.html","ici").". " ;
00552     echo " Exemples d'utilisation&nbsp;:" 
;
00553     finp
() ;
00554     
00555     pre_fichier
("trangXmp.txt","cadre") ;
00556     
00557     finsolution
() ;
00558     
00559     finblockquote
() ;
00560     
00561     ## -------------------------------------------------------------------------------------------
00562     
00563     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # .     Vérification des vérificateurs
00564     
00565     ## -------------------------------------------------------------------------------------------
00566     
00567     blockquote
() ;
00568     
00569     p
("texte") ;
00570     echo " Pour vérifier un document 
$XML, on utilise une grammaire $DTD ou $XSD. " ;
00571     echo " Mais comment vérifier une grammaire 
$DTD ou $XSD&nbsp;?" ;
00572     finp
() ;
00573     
00574     p
("texte") ;
00575     echo " On pourra utiliser les grammaires incorrectes " 
;
00576     echo href
("bad.dtd")." et ".href("bad.xsd")." associées respectivement aux fichiers " ;
00577     echo href
("baddtd.xml")." et ".href("badxsd.xml") ;
00578     echo " pour vérifier votre vérification de vérificateurs (!)." 
;
00579     finp
() ;
00580     
00581     solution
($numExo,$numSerie) ;
00582     
00583     p
("texte") ;
00584     echo " Exercice volontairement corrigé. " 
;
00585     echo href
("verificateurs.txt","Quoique...","nou noir") ;
00586     echo b
("Venez en T.P.&nbsp;!") ;
00587     finp
() ;
00588     
00589     finsolution
() ;
00590     
00591     finblockquote
() ;
00592     
00593     ## -------------------------------------------------------------------------------------------
00594     
00595     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # .     Rajout de contraintes
00596     
00597     ## -------------------------------------------------------------------------------------------
00598     
00599     blockquote
() ;
00600     
00601     p
("texte") ;
00602     echo " Reprendre l'exercice 1 (la molécule) et définir un schéma 
$XSD plus restrictif que la $DTD avec les règles suivantes&nbsp;:" ;
00603     finp
() ;
00604     
00605     $url1 
"https://fr.wikipedia.org/wiki/Liste_des_%C3%A9l%C3%A9ments_chimiques" ;
00606     $url2 
"https://fr.wikipedia.org/wiki/Tableau_p%C3%A9riodique_des_%C3%A9l%C3%A9ments" ;
00607     
00608     ul
() ;
00609       li
("le nom de l'atome doit comporter au moins ".href($url1,"deux lettres","nou noir")." (au fait, pourquoi&nbsp;?)") ;
00610       li
("le nombre d'atomes doit &ecirc;tre un entier non négatif") ;
00611       li
("l'attribut ".href($url2,"lettre","nou noir")." de l'atome doit comporter au moins une lettre en majuscule, suivie au maximum d'une lettre en minuscule (pourquoi&nbsp;?)") ;
00612     finul
() ;
00613     
00614     solution
($numExo,$numSerie) ;
00615     
00616     p
("texte") ;
00617     echo " Exercice volontairement corrigé. " 
;
00618     echo href
("contraintes.txt","Quoique...","nou noir") ;
00619     echo b
("Venez en T.P.&nbsp;!") ;
00620     finp
() ;
00621     
00622     finsolution
() ;
00623     
00624     finblockquote
() ;
00625     
00626     ## -------------------------------------------------------------------------------------------
00627     
00628     pvide
() ;
00629     
00630     ###########################################################################################
00631     
00632     p
() ;
00633     echo href
("montresource.php?nomfic=l2xml_6_tp3.php","Code-source php de cette page","orange_stim nou")."." ;
00634     finp
() ;
00635     
00636     finSection
() ;
00637     
00638     if (!isset($_GET
["standalone"])) { finPage() ;  } ;
00639     ?>

Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.

 

 

retour gH    Retour à la page principale de   (gH)