Listing du fichier m1xml_6_tp1.php
00001 <?php
00002 # # (gH) -_- m1xml_6_tp1.php ; TimeStamp (unix) : 16 Novembre 2017 vers 17:30
00003 include("std.php") ;
00004 include("m1xml_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 $CSS = s_span("CSS" ,"grouge") ;
00012 $JavaScript = s_span("JavaScript" ,"grouge") ;
00013 $numSerie = 1 ;
00014
00015 if (!isset($_GET["standalone"])) { debutPage("XML en M1 (2018), TP $numSerie","strict","","m1xml.js") ; } ;
00016
00017 debutSection() ;
00018 if (isset($_GET["standalone"])) { jsf("m1xml.js") ; } ;
00019 h1("$XML en M1 (2018), université d'Angers ") ;
00020 h2(s_nbsp(4).href("../../","gilles.hunault@univ-angers.fr","gvert nou")) ;
00021 pvide() ;
00022 h2("T.P. numéro 1","gbleu") ;
00023 pvide() ;
00024
00025
00026 ###########################################################################################
00027
00028 $tableauDesRubriques = array() ;
00029 $idr = 0 ;
00030 $idr++; $tableauDesRubriques[$idr] = "Rendre un document $HTML valide pour la grammaire $XHTML 1.0 Strict" ;
00031 $idr++; $tableauDesRubriques[$idr] = "Passer de XHTML 1.0 Transitionnel à $XHTML 1.0 Strict" ;
00032 $idr++; $tableauDesRubriques[$idr] = "Créer un document $XML qui respecte une grammaire $DTD" ;
00033 $idr++; $tableauDesRubriques[$idr] = "Créer un document $XML qui respecte une grammaire $XSD" ;
00034 $idr++; $tableauDesRubriques[$idr] = "Créer des grammaires $DTD et $XSD" ;
00035 $idr++; $tableauDesRubriques[$idr] = "Compter des ".ghBleu("éléments")." et des ".ghBleu("attributs") ;
00036 $idr++; $tableauDesRubriques[$idr] = "Produire du $XML avec ".b("MySQL") ;
00037 $tdmCRLM = new tdm($tableauDesRubriques) ;
00038 $tdmCRLM->titre() ;
00039 $tdmCRLM->menu("oui","oui","nou") ;
00040
00041 pvide() ;
00042
00043 $numExo = 0 ;
00044 direAfficherSolutions($numSerie) ;
00045 pvide() ;
00046
00047 ## -------------------------------------------------------------------------------------------
00048
00049 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # 1. Rendre un document HTML valide pour la grammaire XHTML 1.0 Strict
00050
00051 ## -------------------------------------------------------------------------------------------
00052
00053 blockquote() ;
00054
00055 p("texte") ;
00056 echo " Ce n'est pas parce qu'un navigateur affiche un document qu'il est valide. " ;
00057 echo " Corriger le document $HTML de l'archive ".href("m1xml_bad.zip") ;
00058 echo " pour qu'il soit valide pour la grammaire ".b("XHTML 1.0 Strict").". " ;
00059 echo " On pourra utiliser des outils Web ou en ligne de commande." ;
00060 finp() ;
00061
00062 solution($numExo,$numSerie) ;
00063
00064 p("texte") ;
00065 echo " Que ce soit à l'aide d'un outil Web comme " ;
00066 echo " le ".href("https://validator.w3.org/","W3C validator").", " ;
00067 echo " d'un outil intégré à ".b("Firefox")." comme " ;
00068 echo href("https://addons.mozilla.org/fr/firefox/addon/html-validator/","HTML Validator") ;
00069 echo " ou d'un outil en ligne de commande " ;
00070 echo " comme ".b("rxp").", ".b("xmllint")." ou ".b("xmlstarlet").", " ;
00071 echo " on trouve les erreurs suivantes :" ;
00072 finp() ;
00073
00074 ul() ;
00075
00076 debutli() ; p() ;
00077 echo " il manque la structure englobante ".b("html/head/body")." ;" ;
00078 finp() ; finli() ;
00079
00080 debutli() ; p() ;
00081 echo " il manque donc aussi l'élément ".b("title")." dans la partie ".b("head")." ;" ;
00082 finp() ; finli() ;
00083
00084 debutli() ; p() ;
00085 echo " le deuxième paragraphe qui commence en ligne 4 n'est pas fermé car il n'y a pas de ".b("</p>")." correspondant à son ".b("<p>")." ;" ;
00086 finp() ; finli() ;
00087
00088 debutli() ; p() ;
00089 echo " toujours en ligne 4 l'entité ".b("&nbsp")." est mal écrite, il manque un point-virgule en fin d'entité ;" ;
00090 finp() ; finli() ;
00091
00092 debutli() ; p() ;
00093 echo " le lien pour Google est incorrect, il faut des guillemets autour de l'URL ;" ;
00094 finp() ; finli() ;
00095
00096 debutli() ; p() ;
00097 echo " le lien pour Google est un élément ".em(b("inline"))." et doit être inclus dans un élément de type ".b("boite") ;
00098 echo " comme par exemple un élément ".b("p")." ou ".b("div")."." ;
00099 finp() ; finli() ;
00100
00101 finul() ;
00102
00103 p("texte") ;
00104 echo "La page ".href("m1xml_ok.html")." contient une version corrigée de la page et avec une indication explicite du jeu de caractères utilisé." ;
00105 finp() ;
00106
00107
00108 p("texte") ;
00109 echo s_span(b("Remarque :"),"grouge") ;
00110 echo " une page Web peut comporter autre chose que du ".b("$HTML")." ; " ;
00111 echo " ainsi les erreurs ".b("$CSS")." et ".b("$JavaScript")." ne sont pas détectables via ces outils. " ;
00112 finp() ;
00113
00114 finsolution() ;
00115
00116 finblockquote() ;
00117
00118 ## -------------------------------------------------------------------------------------------
00119
00120 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # 2. Passer de XHTML 1.0 Transitionnel à XHTML 1.0 Strict
00121
00122 ## -------------------------------------------------------------------------------------------
00123
00124 blockquote() ;
00125
00126 p("texte") ;
00127 echo " Quelles sont les principales différences entre les grammaires ".b("XHTML 1.0 Transitionnel")." et ".b("XHTML 1.0 Strict")." ?" ;
00128 finp() ;
00129
00130 solution($numExo,$numSerie) ;
00131
00132 p("texte") ;
00133 echo " Comme le montre notre " ;
00134 echo href("../../Webrd/cmpdtd_f.php","comparateur de grammaires $DTD").", " ;
00135 echo " ce sont surtout les éléments ".b("font").", ".b("iframe")." et ".b("center")." qui ne sont plus admis en ".b("XHTML 1.0 Strict").". " ;
00136 echo " Ce qui signifie qu'il faut utiliser plus de $CSS." ;
00137 finp() ;
00138
00139 p("texte") ;
00140 echo "On pourra lire l'article ".href("https://24ways.org/2005/transitional-vs-strict-markup","trans-vs-strict")." pour plus de détails." ;
00141 finp() ;
00142
00143 p("texte") ;
00144 echo "Passer de ".b("XHTML 1.0 Transitionnel")." à ".b("XHTML 1.0 Strict")." peut être parfois compliqué. " ;
00145 echo " Ainsi pour démarrer une liste avec l'année courante (ici 2017), le code " ;
00146 echo b("<ol start=\"2017\"...")." est incorrect car " ;
00147 echo " l'attribut ".b("start")." est interdit en XHTML strict. Soit on passe par du CSS (mais cela se généralise mal) " ;
00148 echo " soit on utilise du code Javascript pour réaliser un ".b("setAttribute(\"start\",\"2017\"").", ce qui rajoute des difficultés..." ;
00149 finp() ;
00150
00151 finsolution() ;
00152
00153 finblockquote() ;
00154
00155 ## -------------------------------------------------------------------------------------------
00156
00157 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # 3. Créer un document qui respecte une grammaire DTD
00158
00159 ## -------------------------------------------------------------------------------------------
00160
00161 blockquote() ;
00162
00163 p("texte") ;
00164 echo " Nous admettrons pour ce qui suit qu'une molécule est définie par une liste " ;
00165 echo " d'atomes avec le nom des atomes, leur notation et le nombre de ces atomes fournis en attributs. " ;
00166 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 " ;
00167 echo " et par l'atome de nom oxygène, de notation O et en nombre 1 (qui peut donc être omis)." ;
00168 echo " Après avoir lu soigneusement le fichier suivant nommé ".href("molecule_dtd.txt","molecule.dtd").", écrire un fichier ".b("eau.xml") ;
00169 echo " valide pour cette grammaire $DTD. On utilisera un outil en ligne de commande pour vérifier cette validité. " ;
00170 echo " On pourra ignorer les accents. " ;
00171 finp() ;
00172
00173 p() ;
00174 echo b("Fichier molecule.dtd :") ;
00175 finp() ;
00176
00177 pre_fichier("molecule.dtd","cadre") ;
00178
00179 p("texte") ;
00180 echo "Est-ce que cette grammaire $DTD autorise les chaines vides pour les noms, lettres et nombres ?" ;
00181 finp() ;
00182
00183 p("texte") ;
00184 echo "Est-ce qu'il faut respecter l'ordre des attributs tel qu'il est défini dans la grammaire ".$DTD." ?" ;
00185 finp() ;
00186
00187 solution($numExo,$numSerie) ;
00188
00189 p("texte") ;
00190 echo "Voici un fichier ".href("eau.xml")." possible :" ;
00191 finp() ;
00192
00193 pre_fichier("eau.xml","cadrebleu") ;
00194
00195 p("texte") ;
00196 echo "On peut vérifier la validité de ce fichier pour la grammaire ".href("molecule_dtd.txt","molecule.dtd")." via les commandes suivantes :" ;
00197 finp() ;
00198
00199 pre_fichier("molecule_sh1.txt","cadrejaune") ;
00200
00201 p("texte") ;
00202 echo "Hélas, oui cette grammaire $DTD autorise les chaines vides pour les noms, lettres et " ;
00203 echo " les nombres car ".b("CDATA").", comme ".b("#PCDATA")." inclut la chaine vide. " ;
00204 echo " On pourra s'en rendre compte avec le fichier suivant ".href("eauvide.xml")." qui est " ;
00205 echo " valide pour cette grammaire. Attention : une chaine de caractères réduite à un espace " ;
00206 echo " est aussi valide, mais vraiment peut informative..." ;
00207 finp() ;
00208
00209 p("texte") ;
00210 echo "De la même façon, l'ordre des attributs est libre, à condition qu'un attribut n'apparaisse pas deux fois, " ;
00211 echo " comme le montre le fichier suivant, qui est valide pour la $DTD considérée :" ;
00212 finp() ;
00213
00214 p() ;
00215 echo b("Fichier ".href("eaudtdatt.xml")." :") ;
00216 finp() ;
00217
00218 pre_fichier("eaudtdatt.xml","cadre") ;
00219
00220 p("texte") ;
00221 echo "Voici le message d'erreur en cas de duplication d'attribut, comme " ;
00222 echo " c'est le cas pour le fichier ".href("eaudtdatt2.xml")." :" ;
00223 finp() ;
00224
00225 pre_fichier("eaudtdatt2.xml","cadrejaune") ;
00226
00227 pre_fichier("eaudtdatt2.txt","cadrebleu") ;
00228
00229 finsolution() ;
00230
00231 finblockquote() ;
00232
00233 ## -------------------------------------------------------------------------------------------
00234
00235 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # 4. Créer un document qui respecte une grammaire XSD
00236
00237 ## -------------------------------------------------------------------------------------------
00238
00239 blockquote() ;
00240
00241 p("texte") ;
00242 echo " On décide maintenant d'utiliser la grammaire ".href("molecule_xsd.txt","molecule.xsd")." suivante pour stocker les mêmes informations." ;
00243 finp() ;
00244
00245 p() ;
00246 echo b("Fichier molecule.xsd :") ;
00247 finp() ;
00248
00249 pre_fichier("molecule.xsd","cadre") ;
00250
00251 p("texte") ;
00252 echo " Ecrire un fichier ".b("eau2.xml") ;
00253 echo " valide pour cette grammaire $XSD. On utilisera un outil en ligne de commande pour vérifier cette validité." ;
00254 echo " Là encore, on pourra ignorer les accents. " ;
00255 finp() ;
00256
00257 p("texte") ;
00258 echo "Est-ce que cette grammaire $XSD autorise les chaines vides pour les noms, lettres et nombres ?" ;
00259 finp() ;
00260
00261 solution($numExo,$numSerie) ;
00262
00263 p("texte") ;
00264 echo "Voici un fichier ".href("eau2.xml")." possible :" ;
00265 finp() ;
00266
00267 pre_fichier("eau2.xml","cadrebleu") ;
00268
00269 p("texte") ;
00270 echo "On peut vérifier la validité de ce fichier pour la grammaire ".href("molecule_xsd.txt","molecule.xsd")." via les commandes suivantes :" ;
00271 finp() ;
00272
00273 pre_fichier("molecule_sh2.txt","cadrejaune") ;
00274
00275 p("texte") ;
00276 echo "Hélas, oui cette grammaire $XSD autorise les chaines vides pour les noms, lettres, mais pas " ;
00277 echo " pour les nombres car ".b("xs:string")." inclut la chaine vide. " ;
00278 echo " On pourra s'en rendre compte avec le fichier suivant ".href("eau3.xml")." qui est " ;
00279 echo " valide pour cette grammaire. Attention : une chaine de caractères réduite à un espace " ;
00280 echo " est aussi valide, mais vraiment peut informative..." ;
00281 finp() ;
00282
00283 finsolution() ;
00284
00285 finblockquote() ;
00286
00287 ## -------------------------------------------------------------------------------------------
00288
00289 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # 5. Créer des grammaires DTD et XSD"
00290
00291 ## -------------------------------------------------------------------------------------------
00292
00293 blockquote() ;
00294
00295 p("texte") ;
00296 echo " Disons qu'un trajet ferroviaire est représenté schématiquement " ;
00297 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. " ;
00298 echo " Ces informations sont éventuellement complétées, lorsqu'elles sont disponibles, par deux informations ".b("ts")." (pour ".em("time stamp")." en anglais) " ;
00299 echo " qui fournissent respectivement la date et heure de départ et la date et heure d'arrivée. " ;
00300 finp() ;
00301
00302 p("texte") ;
00303 echo " Voici un exemple de fichier $XML regroupant deux trajets, nommé ".href("trajets.xml")."." ;
00304 finp() ;
00305
00306 p() ;
00307 echo b("Fichier trajets.xml :") ;
00308 finp() ;
00309
00310 pre_fichier("trajets.xml","cadre") ;
00311
00312 p("texte") ;
00313 echo " Donner pour ce fichier ".b("trajets.xml") ;
00314 echo " une grammaire $DTD ".em("minimale et raisonnable") ;
00315 echo " qui permet de décrire les trajets ferroviaires puis une grammaire $XSD équivalente." ;
00316 finp() ;
00317
00318 solution($numExo,$numSerie) ;
00319
00320 p("texte") ;
00321 echo " On lira attentivement les fichiers ci-dessous. " ;
00322 finp() ;
00323
00324 p() ;
00325 echo b("Grammaire trajets.dtd :") ;
00326 finp() ;
00327
00328 pre_fichier("trajets.dtd","cadrejaune") ;
00329
00330 p() ;
00331 echo b("Grammaire trajets.xsd :") ;
00332 finp() ;
00333
00334 pre_fichier("trajets.xsd","cadrebleu") ;
00335
00336 p("texte") ;
00337 echo "Il existe des outils pour créer automatiquement des grammaires à partir d'exemples, comme par exemple " ;
00338 echo href("http://www.thaiopensource.com/relaxng/trang.html","trang","grouge").". " ;
00339 finp() ;
00340
00341 finsolution() ;
00342
00343 finblockquote() ;
00344
00345 ## -------------------------------------------------------------------------------------------
00346
00347 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # 6. Compter des éléments et des attributs
00348
00349 ## -------------------------------------------------------------------------------------------
00350
00351 blockquote() ;
00352
00353 p("texte") ;
00354 echo "Compter le nombre de lignes puis lister tous les éléments $XML distincts utilisés dans le ".href("firefox.svg","logo du renard")." ci-dessous, puis " ;
00355 echo " compter tous les éléments avec leurs attributs. " ;
00356 finp() ;
00357
00358 p() ;
00359 nbsp(30) ;
00360 echo href("firefox.svg",img("firefox-logo.jpg","",200)) ;
00361 finp() ;
00362
00363 solution($numExo,$numSerie) ;
00364
00365 p("texte") ;
00366 echo "Il y a en fait assez peu d'éléments utilisés pour le renard. Ainsi la commande " ;
00367 echo b("xmlstarlet el -u firefox.svg")." renvoie une liste de 26 éléments distincts dans l'arbre, pour 348 éléments en tout. " ;
00368 echo "Si on retire les éléments égaux emboités comme g et g/g, il ne reste que 17 \"vrais\" éléments utilisés :" ;
00369 finp() ;
00370
00371 # manip pour produire firefox.elts :
00372 # xmlstarlet el -u > firefox.1
00373 # ménage à la main (sedit) pour produire firefox.2
00374 # numerote firefox.1 entete=1 > a
00375 # numerote firefox.2 entete=1 > b
00376 # fusionne a b 65 et voilà !
00377
00378 pre_fichier("firefox.elts","cadre") ;
00379
00380 p("texte") ;
00381 echo "Pour connaitre les attributs utilisés et pour compter chacun des éléments, on pourrait programmer le comptage des balises d'ouverture et de fermeture, " ;
00382 echo " ce que fait notre programme ".href("montresource.php?nomfic=eltatt_inc.php","eltattres.php")." dont l'interface de départ est ".href("../eltatt.php","ici")."." ;
00383 echo " On pourra cliquer sur le lien ".href("../eltattres.php?url=http://forge.info.univ-angers.fr/~gh/Webrd/Svg/firefox-logo.svg&envoi=envoi","elementsRenard") ;
00384 echo " pour le vérifier et lire les comptages. On peut aussi enchainer de commandes :" ;
00385 finp() ;
00386
00387 # xmlstarlet el firefox.svg | wc -l # 348 éléments
00388 # xmlstarlet el -u firefox.svg | wc -l # 26 éléments
00389 # xmlstarlet el -a firefox.svg | wc -l # 1311 éléments
00390 # xmlstarlet el -a firefox.svg | grep "@" | wc -l # 963 attributs
00391
00392 pre_fichier("renard_elts.txt","cadre") ;
00393
00394 pvide() ;
00395
00396 finsolution() ;
00397
00398 finblockquote() ;
00399
00400 ## -------------------------------------------------------------------------------------------
00401
00402 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # 7. Produire du XML avec MySQL
00403
00404 ## -------------------------------------------------------------------------------------------
00405
00406 blockquote() ;
00407
00408 p("texte") ;
00409 echo "Comment produire des documents $XML correspondant aux tables d'une base de données ".b("MySQL")." ?" ;
00410 finp() ;
00411
00412 solution($numExo,$numSerie) ;
00413
00414 p("texte") ;
00415 echo "Il y a une option ".b("--xml")." dans les commandes ".b("mysql")." et ".b("mysqldump")."." ;
00416 echo " La démonstration en sera faite dans le cadre du TP." ;
00417 finp() ;
00418 pvide() ;
00419
00420 finsolution() ;
00421
00422 finblockquote() ;
00423
00424 ## -------------------------------------------------------------------------------------------
00425
00426 h2("Questions sans réponse affichée dans le navigateur (donc venez en TP !)") ;
00427
00428 blockquote() ;
00429 ul() ;
00430 debutli() ; p("texte") ;
00431 echo "Que faut-il changer dans les fichiers $XML et dans les grammaires $DTD et $XSD précédentes si on décide d'utiliser " ;
00432 echo " des accents, que ce soit avec un encodage " ;
00433 echo href("https://www.alsacreations.com/astuce/lire/83-codages-ascii-latin1-etc.html","latin1") ;
00434 echo " ou " ;
00435 echo href("https://www.w3.org/International/questions/qa-changing-encoding.fr.html","UTF")." ?" ;
00436 finp() ; finli() ;
00437
00438 debutli() ; p("texte") ;
00439 echo "Est-ce qu'un navigateur peut être ".b("validant")." c'est-à-dire refuser l'affichage d'un document $XML s'il n'est pas " ;
00440 echo " valide pour la grammaire indiquée en début de document ?" ;
00441 finp() ; finli() ;
00442
00443 debutli() ; p("texte") ;
00444 echo "Après avoir vérifié qu'un document " ;
00445 echo s_span("DOCX","grouge") ;
00446 echo " ou " ;
00447 echo s_span("ODT","grouge") ;
00448 echo " est une archive (lisible par exemple par ".b("zip")."), chercher comment on peut lister tous les espaces de noms " ;
00449 echo " associés. Où trouve-t-on les grammaires pour ces documents ?" ;
00450 finp() ; finli() ;
00451
00452 finul() ;
00453 finblockquote() ;
00454
00455 ## -------------------------------------------------------------------------------------------
00456
00457 pvide() ;
00458
00459 ###########################################################################################
00460
00461 p() ;
00462 echo href("montresource.php?nomfic=m1xml_6_tp1.php","Code-source php de cette page","orange_stim nou")."." ;
00463 finp() ;
00464
00465 finSection() ;
00466
00467 if (!isset($_GET["standalone"])) { finPage() ; } ;
00468 ?>
Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.
Retour à la page principale de (gH)