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
= 3 ;
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
= 0 ;
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
= 0 ;
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)