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 
;
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 
;
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   
;
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)