Valid XHTML    Valid CSS2    

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&nbsp;:" ;
00072     
finp() ;
00073     
00074     
ul() ;
00075     
00076     
debutli
() ; p() ;
00077      echo
" il manque la structure englobante "
.b("html/head/body")."&nbsp;;" ;
00078     
finp
() ; finli() ;
00079     
00080     
debutli
() ; p() ;
00081      echo
" il manque donc aussi l'élément "
.b("title")." dans la partie ".b("head")."&nbsp;;" ;
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("&lt;/p&gt;")." correspondant à son ".b("&lt;p&gt;")."&nbsp;;" ;
00086     
finp
() ; finli() ;
00087     
00088     
debutli
() ; p() ;
00089      echo
" toujours en ligne 4 l'entité "
.b("&amp;nbsp")." est mal écrite, il manque un point-virgule en fin d'entité &nbsp;;" ;
00090     
finp
() ; finli() ;
00091     
00092     
debutli
() ; p() ;
00093      echo
" le lien pour Google est incorrect, il faut des guillemets autour de l'URL &nbsp;;" ;
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&nbsp;:"),"grouge") ;
00110     echo
" une page Web peut comporter autre chose que du "
.b("$HTML")."&nbsp;; " ;
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")."&nbsp;?" ;
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
("&lt;ol&nbsp;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&nbsp;:") ;
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&nbsp;?" ;
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."&nbsp;?" ;
00185     
finp() ;
00186     
00187     
solution
($numExo,$numSerie) ;
00188     
00189     
p
("texte") ;
00190     echo
"Voici un fichier "
.href("eau.xml")." possible&nbsp;:" ;
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&nbsp;:" ;
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&nbsp;:" ;
00212     
finp() ;
00213     
00214     
p() ;
00215     echo
b
("Fichier ".href("eaudtdatt.xml")."&nbsp;:") ;
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")."&nbsp;:" ;
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&nbsp;:") ;
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&nbsp;?" ;
00259     
finp() ;
00260     
00261     
solution
($numExo,$numSerie) ;
00262     
00263     
p
("texte") ;
00264     echo
"Voici un fichier "
.href("eau2.xml")." possible&nbsp;:" ;
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&nbsp;:" ;
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&nbsp;:") ;
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&nbsp;:") ;
00326     
finp() ;
00327     
00328     
pre_fichier
("trajets.dtd","cadrejaune") ;
00329     
00330     
p() ;
00331     echo
b
("Grammaire trajets.xsd&nbsp;:") ;
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&nbsp;:" ;
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&amp;envoi=envoi","elementsRenard") ;
00384     echo
" pour le vérifier et lire les comptages. On peut aussi enchainer de commandes&nbsp;:" ;
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")."&nbsp;?" ;
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&nbsp;!)") ;
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")."&nbsp;?" ;
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&nbsp;?" ;
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&nbsp;?" ;
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 gH    Retour à la page principale de   (gH)