Listing du fichier l2xml_6_tp1.php
00001 <?php
00002 # # (gH) -_- l2xml_6_tp1.php ; TimeStamp (unix) : 29 Juillet 2017 vers 20:02
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 $CSS = s_span("CSS" ,"grouge") ;
00012 $JavaScript = s_span("JavaScript" ,"grouge") ;
00013
00014 $recode = ghVert("recode") ;
00015 $iconv = ghVert("iconv") ;
00016 $rxp = ghVert("rxp") ;
00017 $xmllint = ghVert("xmllint") ;
00018 $xmlstarlet = ghVert("xmlstarlet") ;
00019 $xsltproc = ghVert("xsltproc") ;
00020
00021 $numSerie = 1 ;
00022
00023 if (!isset($_GET["standalone"])) { debutPage("XML en L2, TP $numSerie","strict","","l2xml.js") ; } ;
00024
00025 debutSection() ;
00026 if (isset($_GET["standalone"])) { jsf("l2xml.js") ; } ;
00027 h1("$XML en L2, université d'Angers ") ;
00028 h2(s_nbsp(4).href("../../","gilles.hunault@univ-angers.fr","gvert nou")) ;
00029 pvide() ;
00030 h2(s_span("T.P. numéro $numSerie","gbleu")." : outils ligne de commandes et structuration $XML") ;
00031 pvide() ;
00032
00033 ###########################################################################################
00034
00035 $tableauDesRubriques = array() ;
00036 $idr = 0 ;
00037 $idr++; $tableauDesRubriques[$idr] = "Outils logiciels en ligne de commandes" ;
00038 $idr++; $tableauDesRubriques[$idr] = "Rendre un document $HTML valide pour la grammaire $XHTML 1.0 Strict" ;
00039 $idr++; $tableauDesRubriques[$idr] = "Passer de XHTML 1.0 Transitionnel à $XHTML 1.0 Strict" ;
00040 $idr++; $tableauDesRubriques[$idr] = "Réparer des fichiers mal formés ?" ;
00041 $idr++; $tableauDesRubriques[$idr] = "Compter des ".ghBleu("éléments")." et des ".ghBleu("attributs") ;
00042 $idr++; $tableauDesRubriques[$idr] = "Attributs uniques" ;
00043 $idr++; $tableauDesRubriques[$idr] = "XML et bureautique" ;
00044 $tdmCRLM = new tdm($tableauDesRubriques) ;
00045 $tdmCRLM->titre() ;
00046 $tdmCRLM->menu("oui","oui","nou") ;
00047
00048 pvide() ;
00049 $numExo = 0 ;
00050 direAfficherSolutions($numSerie) ;
00051 pvide() ;
00052
00053 ## -------------------------------------------------------------------------------------------
00054
00055 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # 1. Outils logiciels en ligne de commandes
00056
00057 ## -------------------------------------------------------------------------------------------
00058
00059 blockquote() ;
00060
00061 p("texte") ;
00062 echo " Vérifier que, sous Linux dans les salles de T.P. au département informatique de la faculté des sciences, " ;
00063 echo " les outils en ligne de commandes nommés " ;
00064 echo " $recode, $iconv, $rxp, $xmllint, $xmlstarlet et $xsltproc sont installés. " ;
00065 echo " On indiquera leur version respective et on lira l'aide en ligne afin d'en connaitre les paramètres. " ;
00066 finp() ;
00067
00068 p("texte") ;
00069 echo "Où sont les pages d'aides associées sur le Web ? " ;
00070 finp() ;
00071
00072 p("texte") ;
00073 echo "Rappeler comment on teste si un fichier est bien formé avec $rxp, $xmllint et $xmlstarlet. " ;
00074 echo " On pourra utiliser les fichiers " ;
00075 echo href("dbf.xml")." et ".href("dmf.xml")." pour tester les commandes associées. " ;
00076 echo " Doit-on rapatrier les fichiers, par exemple avec ".href("https://doc.ubuntu-fr.org/wget","wget") ;
00077 echo " ou est-ce que $rxp, $xmllint, $xmlstarlet et $xsltproc sont capables de lire des URL ?" ;
00078 finp() ;
00079
00080 p("texte") ;
00081 echo " Pour celles et ceux qui font les T.P. à distance, vérifier que les exécutables de l'archive " ;
00082 echo href("outilsXMLpourWindows.zip","outilsXMLpourWindows") ;
00083 echo " fournissent les mêmes outils pour Windows. " ;
00084 finp() ;
00085
00086 p("texte") ;
00087 echo " Afin de tester facilement les fichiers du cours, on trouvera dans l'archive " ;
00088 echo href("documentsL2Xml.zip","documentsL2Xml") ;
00089 echo " tousles fichiers XML, DTD, XSD et XSL du cours. " ;
00090 finp() ;
00091
00092 p("texte") ;
00093 echo " Au passage : quel visualiseur de fichiers peut-on utiliser pour voir/afficher les fichiers $XML ?" ;
00094 echo " Et quel éditeur de texte pour éditer/afficher les fichiers $XML ?" ;
00095 finp() ;
00096
00097
00098 solution($numExo,$numSerie) ;
00099
00100 p() ;
00101 echo " La page officielle pour $rxp est " ;
00102 echo href("http://www.cogsci.ed.ac.uk/~richard/rxp.html").". " ;
00103 echo " La page d'aide (man) est ".href("http://www.cogsci.ed.ac.uk/~richard/rxp.txt")." dont " ;
00104 echo " une version un peu plus lisible est ".href("rxp_help.html","ici").". " ;
00105 echo " Une autre page d'aide est " ;
00106 echo href("https://www.spec.org/mpi/docs/specrxp.html","là") ;
00107 echo " (merci à M. Racine et R. Gaborieau de nous l'avoir signalée)." ;
00108 finp() ;
00109
00110 p() ;
00111 echo b("xmllint")." fait partie du package ".b("libxml2-utils")." et est disponible via " ;
00112 echo href("http://xmlsoft.org").". " ;
00113 echo "La page d'aide est ".href("http://xmlsoft.org/xmllint.html").". " ;
00114 finp() ;
00115
00116 p() ;
00117 echo "On peut trouver " ;
00118 echo "la page d'aide pour ".b("xmlstarlet")." sur sourceforge : " ;
00119 echo href("http://xmlstar.sourceforge.net/doc/UG/xmlstarlet-ug.html","xmlstarlet-ug.html").". " ;
00120 finp() ;
00121
00122 p() ;
00123 echo "On peut trouver " ;
00124 echo "la page d'aide pour ".b("xsltproc")." sur le site ".b("xmlsoft")." : " ;
00125 echo href("http://xmlsoft.org/XSLT/xsltproc2.html","xsltproc2.html").". " ;
00126 finp() ;
00127
00128 p("texte") ;
00129 echo " Sur notre ordinateur, la version de ces logiciels est " ;
00130 finp() ;
00131
00132 pre_fichier("outils-version.txt","cadre") ;
00133
00134 p("texte") ;
00135 echo " Voici les commandes à utiliser pour tester si un fichier est bien formé :" ;
00136 finp() ;
00137
00138 pre_fichier("bf-cmds.txt","cadre") ;
00139
00140 p("texte") ;
00141 echo " On voit donc que ".href("dbf.xml")." est bien formé et que ".href("dmf.xml")." ne l'est pas." ;
00142 finp() ;
00143
00144 p("texte") ;
00145 echo " L'aide en ligne s'obtient avec le paramètre ".b("--help").". Pour $rxp l'aide est très succincte, " ;
00146 echo " mais ".b("man rxp")." fournit plus d'informations. " ;
00147 finp() ;
00148
00149 p("texte") ;
00150 echo " Pour $xmllint, $xmlstarlet et $xsltproc il y a beaucoup d'options. " ;
00151 finp() ;
00152
00153 p("texte") ;
00154 echo " $rxp, $xmllint et $xmlstarlet sont capables de lire des URL." ;
00155 finp() ;
00156
00157 p("texte") ;
00158 echo " Voici d'autres commandes à exécuter pour tester que les outils fournis sont fonctionnels :" ;
00159 finp() ;
00160
00161 pre_fichier("autres-cmds.txt","cadre") ;
00162
00163 p("texte") ;
00164 echo " Pour celles et ceux qui ne sauraient pas ou qui ne voudraient pas installer de logiciel, " ;
00165 echo " on peut utiliser des pages Web mais il faut alors copier/coller ou importer le(s) fichier(s) à traiter, " ;
00166 echo " comme par exemple le site ".href("https://www.xmlvalidation.com/","xmlvalidation")."." ;
00167 finp() ;
00168
00169 p("texte") ;
00170 echo " La visualisation de fichiers $XML peut se faire avec un navigateur (Chrome, Firefox, Opera...). " ;
00171 echo " La plupart des navigateurs sont capables de montrer/masquer ou plier/déplier les contenus des éléments." ;
00172 echo " N'importe quel éditeur de texte pour éditer/afficher les fichiers $XML pourrait suffire " ;
00173 echo " s'il s'agissait d'écrire du texte. Toutefois, à cause de la syntaxe stricte de $XML, un éditeur qui sait " ;
00174 echo " colorier les éléments, les attributs via une coloration syntaxique et qui est capable de plier/déplier les contenus des éléments " ;
00175 echo " devient vite indispensable. Nous conseillons le logiciel gratuit ".href("https://www.geany.org/","Geany").", " ;
00176 echo " disponible sous Linux comme sous Windows et Mac, téléchargeable ".href("https://www.geany.org/download/releases/","ici").". " ;
00177 echo " D'autres éditeurs sont possibles, comme ".b("Notepad++").", ".b("Visual Studio")."... " ;
00178 echo " pourvu que vous les maitrisiez et qu'ils aient la coloration syntaxique, le repliement, le choix de l'encodage... " ;
00179 finp() ;
00180
00181 $img1 = "xsl1.png" ;
00182 $img2 = "xsl2.png" ;
00183 p("texte") ;
00184 nbsp() ; br() ; nbsp() ;
00185 nbsp(15) ;
00186 echo href($img1,img($img1,"",400)) ;
00187 nbsp(15) ;
00188 echo href($img2,img($img2,"",400)) ;
00189 finp() ;
00190
00191 finsolution() ;
00192
00193 finblockquote() ;
00194
00195 ## -------------------------------------------------------------------------------------------
00196
00197 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # 2. Rendre un document HTML valide pour la grammaire XHTML 1.0 Strict
00198
00199 ## -------------------------------------------------------------------------------------------
00200
00201 blockquote() ;
00202
00203 p("texte") ;
00204 echo " Ce n'est pas parce qu'un navigateur affiche un document qu'il est valide. " ;
00205 echo " Corriger le document $HTML de l'archive ".href("l2xml_bad.zip") ;
00206 echo " pour qu'il soit valide pour la grammaire ".b("XHTML 1.0 Strict").". " ;
00207 echo " On pourra utiliser des outils Web ou en ligne de commandes." ;
00208 finp() ;
00209
00210 solution($numExo,$numSerie) ;
00211
00212 p("texte") ;
00213 echo " Que ce soit à l'aide d'un outil Web comme " ;
00214 echo " le ".href("https://validator.w3.org/","W3C validator").", " ;
00215 echo " d'un outil intégré à ".b("Firefox")." comme " ;
00216 echo href("https://addons.mozilla.org/fr/firefox/addon/html-validator/","HTML Validator") ;
00217 echo " ou d'un outil en ligne de commandes " ;
00218 echo " comme ".b("rxp").", ".b("xmllint")." ou ".b("xmlstarlet").", " ;
00219 echo " on trouve les erreurs suivantes :" ;
00220 finp() ;
00221
00222 ul() ;
00223
00224 debutli() ; p() ;
00225 echo " il manque la structure englobante ".b("html/head/body")." ;" ;
00226 finp() ; finli() ;
00227
00228 debutli() ; p() ;
00229 echo " il manque donc aussi l'élément ".b("title")." dans la partie ".b("head")." ;" ;
00230 finp() ; finli() ;
00231
00232 debutli() ; p() ;
00233 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>")." ;" ;
00234 finp() ; finli() ;
00235
00236 debutli() ; p() ;
00237 echo " toujours en ligne 4 l'entité ".b("&nbsp")." est mal écrite, il manque un point-virgule en fin d'entité ;" ;
00238 finp() ; finli() ;
00239
00240 debutli() ; p() ;
00241 echo " le lien pour Google est incorrect, il faut des guillemets autour de l'URL ;" ;
00242 finp() ; finli() ;
00243
00244 debutli() ; p() ;
00245 echo " le lien pour Google est un élément ".em(b("inline"))." et doit être inclus dans un élément de type ".b("boite") ;
00246 echo " comme par exemple un élément ".b("p")." ou ".b("div")."." ;
00247 finp() ; finli() ;
00248
00249 finul() ;
00250
00251 p("texte") ;
00252 echo "La page ".href("l2xml_ok.html")." contient une version corrigée de la page et avec une indication explicite du jeu de caractères utilisé." ;
00253 finp() ;
00254
00255
00256 p("texte") ;
00257 echo s_span(b("Remarque :"),"grouge") ;
00258 echo " une page Web peut comporter autre chose que du ".b("$HTML")." ; " ;
00259 echo " ainsi les erreurs ".b("$CSS")." et ".b("$JavaScript")." ne sont pas détectables via ces outils. " ;
00260 finp() ;
00261
00262 finsolution() ;
00263
00264 finblockquote() ;
00265
00266 ## -------------------------------------------------------------------------------------------
00267
00268 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # 3. Passer de XHTML 1.0 Transitionnel à XHTML 1.0 Strict
00269
00270 ## -------------------------------------------------------------------------------------------
00271
00272 blockquote() ;
00273
00274 p("texte") ;
00275 echo " Quelles sont les principales différences entre les grammaires ".b("XHTML 1.0 Transitionnel")." et ".b("XHTML 1.0 Strict")." ?" ;
00276 finp() ;
00277
00278 solution($numExo,$numSerie) ;
00279
00280 p("texte") ;
00281 echo " Comme le montre notre " ;
00282 echo href("../../Webrd/cmpdtd_f.php","comparateur de grammaires $DTD").", " ;
00283 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").". " ;
00284 echo " Ce qui signifie qu'il faut utiliser plus de $CSS." ;
00285 finp() ;
00286
00287 p("texte") ;
00288 echo "On pourra lire l'article ".href("https://24ways.org/2005/transitional-vs-strict-markup","trans-vs-strict")." pour plus de détails." ;
00289 finp() ;
00290
00291 p("texte") ;
00292 echo "Passer de ".b("XHTML 1.0 Transitionnel")." à ".b("XHTML 1.0 Strict")." peut être parfois compliqué. " ;
00293 echo " Ainsi pour démarrer une liste avec l'année courante (ici 2017), le code " ;
00294 echo b("<ol start=\"2017\"...")." est incorrect car " ;
00295 echo " l'attribut ".b("start")." est interdit en XHTML strict. Soit on passe par du CSS (mais cela se généralise mal) " ;
00296 echo " soit on utilise du code Javascript pour réaliser un ".b("setAttribute(\"start\",\"2017\")").", ce qui rajoute des difficultés..." ;
00297 finp() ;
00298
00299 finsolution() ;
00300
00301 finblockquote() ;
00302
00303 ## -------------------------------------------------------------------------------------------
00304
00305 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # 4. Réparer des fichiers mal formés
00306
00307 ## -------------------------------------------------------------------------------------------
00308
00309 blockquote() ;
00310
00311 p("texte") ;
00312 echo " Indiquez pour chacun des fichiers suivant s'il est bien formé ou non. " ;
00313 echo " Lorsqu'il n'est pas bien formé, indiquez si on peut le corriger pour qu'il le soit. " ;
00314 finp() ;
00315
00316 montreFichiers(1,5,"fichier","visuExo4") ;
00317
00318 solution($numExo,$numSerie) ;
00319
00320 p("texte") ;
00321 echo "Aucun souci pour le fichier ".href("fichier01.xml")." : il est bien formé." ;
00322 finp() ;
00323
00324 p("texte") ;
00325 echo "Il y a juste une erreur dans le fichier ".href("fichier02.xml").". " ;
00326 echo " C'est à la ligne 723. On y trouve ".b("<xsd:sequence minOccurs= maxOccurs>").". " ;
00327 echo " Il serait sans doute possible de le corriger, par exemple en ajoutant juste des guillemets et pas de valeur pour ces attributs, mais ce " ;
00328 echo " n'est certainement pas une bonne solution. En effet, un nombre d'occurrences est soit un nombre entier soit la valeur " ;
00329 echo b("unbounded")." et à moins de connaitre précisément ce que spécifie ce fichier il n'est pas possible de choisir des valeurs " ;
00330 echo" pour ces deux attributs." ;
00331 finp() ;
00332
00333 p("texte") ;
00334 echo "Il y a le même problème pour ".href("fichier03.xml")." : il est mal formé car on a deux fois un même nom " ;
00335 echo " d'attribut. Choisir lequel est le bon (pour autant qu'il y en ait un qui soit le bon) ne relève pas de compétences en informatique. " ;
00336 finp() ;
00337
00338 p("texte") ;
00339 echo "Il y a plusieurs erreurs corrigeables dans ".href("fichier04.xml")."." ;
00340 echo " Tout d'abord à la ligne 219, il manque ".b("</NOM>").". " ;
00341 echo " Ensuite, à la ligne 673, il manque un ".b("P")." pour bien terminer l'élément ".b("ACTPNOM").". " ;
00342 echo " Enfin, à la ligne 704 il y a un petit \"s\" en trop." ;
00343 echo " A ce propos, il y de fortes chances que cette ligne 704 soit incorrecte : " ;
00344 echo " les prénoms sont écrits pour tous les autres acteurs avec l'élément ".b("ACTPNOM").". " ;
00345 echo " Or ici c'est l'élément ".b("ACTPRENOM")." qui est utilisé. Au final, le document sera bien formé, mais il ne sera pas valide si on définit dans une " ;
00346 echo " grammaire qu'on doit utiliser un élément ".b("ACTPNOM")." pour définir un prénom..." ;
00347 finp() ;
00348
00349 p("texte") ;
00350 echo " Il y a aussi plusieurs erreurs dans ".href("fichier05.xml")." mais elles ne sont sans doute pas toutes corrigeables. " ;
00351 finp() ;
00352
00353 finsolution() ;
00354
00355 finblockquote() ;
00356
00357 ## -------------------------------------------------------------------------------------------
00358
00359 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # 5. Compter des éléments et des attributs
00360
00361 ## -------------------------------------------------------------------------------------------
00362
00363 blockquote() ;
00364
00365 p("texte") ;
00366 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 " ;
00367 echo " compter tous les éléments avec leurs attributs. " ;
00368 finp() ;
00369
00370 p() ;
00371 nbsp(30) ;
00372 echo href("firefox.svg",img("firefox-logo.jpg","",200)) ;
00373 finp() ;
00374
00375 p("texte") ;
00376 echo " On s'intéresse ensuite au fichier ".href("leadb880.xml")." suivant qui contient des données pour des protéines " ;
00377 echo href("../../Leadb","LEA","grouge")." :" ;
00378 finp() ;
00379
00380 p() ;
00381 textarea_fichier("leadb880","tajaunec",25,80,"leadb","leadb880.xml","") ;
00382 finp() ;
00383
00384 p("texte") ;
00385 echo "Après avoir décrit la structure du fichier, " ;
00386 echo " compter le nombre de lignes, le nombre de lignes vides, d'éléments et d'attributs. " ;
00387 echo " Vous pouvez utiliser tout outil logiciel qui vous parait adapté. Comment trouver le nombre d'éléments distincts ?" ;
00388 finp() ;
00389
00390 p("texte") ;
00391 echo " Quelles options des commandes ".b("grep")." et ".b("sort")." devriez-vous réviser au passage ?" ;
00392 finp() ;
00393
00394
00395 p("texte") ;
00396 echo " Si vous êtes sous Windows, il faut installer ".b("grep")." à partir de la page " ;
00397 echo href("http://gnuwin32.sourceforge.net/packages/grep.htm","gnuwin32 grep")." sans oublier les dépendances..." ;
00398 echo " Vous pouvez aussi installer " ;
00399 echo href("http://gnuwin32.sourceforge.net/packages/coreutils.htm","wc")." mais " ;
00400 echo " la commande ".b("find")." de Windows avec les options ".b("/c")." et ".b("/v")." remplace ".b("wc").". " ;
00401 finp() ;
00402
00403 solution($numExo,$numSerie) ;
00404
00405 p("texte") ;
00406 echo "Il y a en fait assez peu d'éléments utilisés pour le renard. Ainsi la commande " ;
00407 echo b("xmlstarlet el -u firefox.svg")." renvoie une liste de 26 éléments distincts dans l'arbre, pour 348 éléments en tout. " ;
00408 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 :" ;
00409 finp() ;
00410
00411 # manip pour produire firefox.elts :
00412 # xmlstarlet el -u > firefox.1
00413 # ménage à la main (sedit) pour produire firefox.2
00414 # numerote firefox.1 entete=1 > a
00415 # numerote firefox.2 entete=1 > b
00416 # fusionne a b 65 et voilà !
00417
00418 pre_fichier("firefox.elts","cadre") ;
00419
00420 p("texte") ;
00421 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, " ;
00422 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")."." ;
00423 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") ;
00424 echo " pour le vérifier et lire les comptages. On peut aussi enchainer des commandes Unix :" ;
00425 finp() ;
00426
00427 pre_fichier("renard_elts.txt","cadre") ;
00428
00429 p("texte") ;
00430 echo " Pour le fichier ".href("leadb880.xml").", " ;
00431 echo " visiblement l'élément racine du fichier se nomme ".b("proteins")." et il ne contient que " ;
00432 echo " des éléments nommés ".b("protein").". Chaque élément ".b("protein")." contient trois éléments, à savoir " ;
00433 echo b("accession").", ".b("class")." et ".b("fasta").". De plus seul cet élément ".b("fasta")." possède un attribut nommé ".b("length").". " ;
00434 finp();
00435
00436 p("texte") ;
00437 echo " Avec la commande ".b("xmlstarlet el -u")." on dispose de la structure des données en termes d'éléments :" ;
00438 finp();
00439
00440 pre_fichier("leadb_stru.txt","cadrebleu") ;
00441
00442 p("texte") ;
00443 echo "Il ne manque donc que la ligne ".ghBleu("proteins/protein/fasta/@length")." pour compléter cette description des éléments et attributs." ;
00444 finp();
00445
00446 p("texte") ;
00447 echo "On peut facilement obtenir le nombre de lignes avec la commande système nommée ".b("wc").". " ;
00448 echo " Pour le nombre de lignes vides, chainer ".b("grep")." et ".b("wc")." est sans doute un bon choix. " ;
00449 #echo " Pour le nombre d'élements distincts et la structure, ".b("xmlstarlet")." et ".b("trang")." sont des outils biens adaptés. " ;
00450 echo " Pour le nombre d'éléments distincts et la structure, ".b("xmlstarlet")." est un outil biens adapté. " ;
00451 echo " Enfin, pour le nombre d'éléments en tout, on peut chainer ".b("xmlstarlet")." et ".b("wc")." alors que " ;
00452 echo " pour le nombre d'attributs en tout, il faut chainer ".b("xmlstarlet").", ".b("grep")." et ".b("wc").". " ;
00453 echo " Voici le détail des commandes associées :" ;
00454 finp() ;
00455
00456 pre_fichier("leadb880-cmds.txt","cadrejaune") ;
00457
00458 p("texte") ;
00459 echo "Attention aux commandes ".b("Unix").". Elles sont efficaces à condition de bien les connaitre. " ;
00460 echo " Ainsi, ".b("grep -c")." compte les lignes correspondantes, ce qui évite de chainer ".b("grep")." et ".b("wc").". " ;
00461 echo " La commande ".b("uniqu")." ne fonctionne que pour les lignes ".ghRouge(em("adjacentes")).". Il est donc prudent " ;
00462 echo " de commencer par trier avec ".b("sort")." avant d'utiliser ".b("uniqu").". " ;
00463 finp() ;
00464
00465 pre_fichier("leadb880-cmds2.txt","cadrejaune") ;
00466
00467 p("texte") ;
00468 echo " Il serait sans doute bon de réviser les options ".ghBleu("-c -i -n -l -v")." pour ".b("grep")." et " ;
00469 echo ghBleu("-k -n -r -u")." pour ".b("sort")."." ;
00470 finp() ;
00471
00472 finsolution() ;
00473
00474 finblockquote() ;
00475
00476 ## -------------------------------------------------------------------------------------------
00477
00478 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # 6. Attributs uniques
00479
00480 ## -------------------------------------------------------------------------------------------
00481
00482 blockquote() ;
00483
00484 p("texte") ;
00485 echo " On s'intéresse ici au document ".href("films2.xml")." qui contient des films et des artistes. " ;
00486 finp() ;
00487
00488 blockquote() ;
00489 p() ;
00490 textarea_fichier("films2","tajaunec",25,80,"films","films2.xml","") ;
00491 finp() ;
00492 finblockquote() ;
00493
00494 p("texte") ;
00495 echo "Donner la structure explicite du fichier en termes d'éléments." ;
00496 finp() ;
00497
00498 p("texte") ;
00499 echo " Trouver comment on peut produire la liste des attributs uniques du fichier, ce que ne sait pas faire ".b("xmlstarlet").". " ;
00500 echo " Voici ce qu'on s'attend à voir :" ;
00501 finp() ;
00502
00503 pre_fichier("films2_att.txt","cadrejaune") ;
00504
00505 solution($numExo,$numSerie) ;
00506
00507 p("texte") ;
00508 echo " Avec ".b("xmlstarlet el -u")." on peut voir la structure en termes d'éléments :" ;
00509 finp();
00510
00511 pre_fichier("films2_stru.txt","cadrejaune") ;
00512
00513 p("texte") ;
00514 echo "Il y a donc deux sous-arbres, un pour les artistes et un pour les films. " ;
00515 echo " Les artistes ont un élément pour l'année, de naissance, le nom et le prénom. " ;
00516 echo " Les films ont un élément genre, mes (metteur en scène), pays, résumé (sans accent), titre et un sous-arbre roles. " ;
00517 echo " Cet élément roles contient des éléments role (au singulier) avec un intitulé, un nom et un prénom." ;
00518 finp();
00519
00520 p("texte") ;
00521 echo "La commande suivante compléte la description des éléments uniques " ;
00522 echo " en chainant ".b("xmlstarlet").", ".b("grep")." et ".b("sort")." :" ;
00523 finp();
00524
00525 p("texte") ;
00526 nbsp(5) ;
00527 echo ghRouge(' xmlstarlet el -a films2.xml | grep "/@" | sort -u ')."." ;
00528 finp();
00529
00530 finsolution() ;
00531
00532 finblockquote() ;
00533
00534 ## -------------------------------------------------------------------------------------------
00535
00536 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # 7. XML et bureautique
00537
00538 ## -------------------------------------------------------------------------------------------
00539
00540 blockquote() ;
00541
00542 p("texte") ;
00543 echo "Dans quelle mesure peut-on dire qu'un fichier-archive, une base de données et un fichier $XML sont des conteneurs ? " ;
00544 finp() ;
00545
00546 p("texte") ;
00547 echo "Ecrire le texte "."«Bon ".b("courage")." à " ;
00548 echo s_span("tous","bleu")." et à ".ghBleu("toutes")."» -- exactement comme cela, avec " ;
00549 echo em("courage")." en gras, ".em("tous")." en bleu et ".em("toutes")." en gras et bleu foncé -- " ;
00550 echo " dans un fichier Word au format ".b("DOCX").", puis au format ".b("RTF")." ; " ;
00551 echo " écrire le même texte dans un fichier Libre Office au format ".b("Texte ODT").". Si ce sont des fichiers ".ghBleu("XML").", pourquoi ne peut-on pas les " ;
00552 echo " ouvrir directement avec un éditeur de texte ? A quoi correspond le format ".b(".FODT")." ?" ;
00553 finp() ;
00554
00555 p("texte") ;
00556 echo " Reprendre avec les informations ci-dessous (fichier ".href("tableur_data.txt").") qu'on mettra dans les cellules d'un tableur, qu'on sauvegardera au format " ;
00557 echo ghVert("XLSX").", ".ghVert("CSV")." et ".ghVert("Classeur ODS")." :" ;
00558 finp() ;
00559
00560 pre_fichier("tableur_data.txt","cadrejaune") ;
00561
00562 solution($numExo,$numSerie) ;
00563
00564 p("texte") ;
00565 echo " Un fichier-archive, " ;
00566 echo " une base de données ".ghVert("MySql").", un document ".ghRouge("XML").", un objet (au sens de la programmation objets) ou même un ".b("DVD")." du commerce sont des " ;
00567 echo " conteneurs dans la mesure où ils permettent de regrouper des contenus (données) hétérogènes : une base de données contient des tables qui elles-mêmes contiennent des champs, " ;
00568 echo " l'élément racine du document $XML peut contenir d'autres éléments qui peuvent contenir eux-mêmes d'autres éléments, " ;
00569 echo " un objet en ".ghVert("PO")." peut contenir plusieurs variables-mémoires, voire plusieurs tableaux ou d'autres objets, " ;
00570 echo " un ".b("DVD")." du commerce contient des vidéos, des sous-titres, voire des menus, des images... " ;
00571 echo " Ce qu'apportent en plus $XML et l'objet, c'est la possibilité d'agir sur leurs contenus... " ;
00572 finp() ;
00573
00574 p("texte") ;
00575 echo "On pourrait exporter une base de données en $XML avec la structure suivante " ;
00576 echo " (".ghVert("MySql")." dispose d'une ".href("../mysqlhlp.txt","option de sortie")." " ;
00577 echo ghVert("HTML")." et d'une ".href("../mysqlman.txt","option de sortie")." $XML qui ressemble un peu à celle-ci) :" ;
00578 finp() ;
00579
00580 pre_fichier("mysqlEnXml.txt","cadre") ;
00581
00582 p("texte") ;
00583 echo "Les fichiers ".ghVert(".ODS")." et ".ghVert(".DOCX")." sont des documents compressés, c'est-à-dire des archives et ne peuvent donc pas être lus directement. Seul le format ".ghVert(".RTF") ;
00584 echo " est lisible, si l'on peut dire. En voici le contenu :" ;
00585 finp() ;
00586
00587 pre_fichier("boncourage.rtf","cadre") ;
00588
00589 p("texte") ;
00590 echo "Un afffichage plus lisible pour un fichier similaire se trouve à l'adresse ".href("../courage.rtfste","courage.rtfste") ;
00591 echo " qui correspond à l'exercice 9 de nos exercices PHP ".href("../tds.php","série 1")." " ;
00592 echo "(".href("../tds.php#cours1","énoncé") ;
00593 echo ", ".href("../solutions.php#cours1","solution").")." ;
00594 echo " On pourra aussi consulter l'exercice 1 de notre cours " ;
00595 echo href("../../Farcompr/sac.htm","FarCompr").", partie stockage " ;
00596 echo " (".href("../../Farcompr/sacex.htm#p1","énoncé").",".href("../../Farcompr/sacor.htm#p1","solution")."). " ;
00597 finp() ;
00598
00599 p("texte") ;
00600 echo "Pour retrouver les fichiers des archives, il suffit d'utiliser un décompresseur comme ".b("unzip")." par exemple : " ;
00601 finp() ;
00602
00603 pre_fichier("boncourage.listes.txt","cadre") ;
00604
00605 p("texte") ;
00606 echo "Les «vrais» fichiers pour ".b("Open Office")." et ".b("Microsoft Office") ;
00607 echo " sont nommés respectivement ".href("content.xml")." et ".href("document.xml","document.xml")." :" ;
00608 finp() ;
00609
00610 pre_fichier("boncourage.files.txt","cadre") ;
00611
00612 p("texte") ;
00613 echo " Si la ".href("http://fr.wikipedia.org/wiki/OpenDocument","documentation")." du Wiki français détaille ce que sont les fichiers ".b("Open Document").", ";
00614 echo " elle ne dit rien sur ce qu'est le format ".b(".FODT")." alors que la ".href("http://en.wikipedia.org/wiki/OpenDocument_technical_specification","documentation") ;
00615 echo " du Wiki anglais explique qu'il s'agit d'un format «à plat» (non compressé) monobloc (tout en un seul fichier). On pourra le vérifier en consultant " ;
00616 echo href("boncourage.fodt")." (judicieusement recopié en ".href("boncourage_fodt.xml").") dont le contenu est :" ;
00617 finp() ;
00618
00619 pre_fichier("boncourage.fodt.txt","cadre") ;
00620
00621 p("texte") ;
00622 echo "Le format ".b("CSV")." est un format texte délimité dont le séparateur par défaut est ".s_span("la virgule","gvert")." en mode EN et ".s_span("le point-virgule","gvert")." en modeFR. " ;
00623 echo "Le ".href("http://en.wikipedia.org/wiki/Comma-separated_values","wiki anglais")." et le ".href("http://fr.wikipedia.org/wiki/Comma-separated_values","wiki français") ;
00624 echo " ne fournissent pas exactement les mêmes informations sur ce format :" ;
00625 finp() ;
00626
00627 pre_fichier("tableur_data.csv.txt","cadre") ;
00628
00629 p("texte") ;
00630 echo "Là encore, les formats ".s_span("ODS","gvert")." et ".s_span("XLSX","gvert")." correspondent à des archives de fichiers ".s_span("XML","grouge")." :" ;
00631 finp() ;
00632
00633 pre_fichier("tableur_data.files.txt","cadre") ;
00634
00635 p("texte") ;
00636 echo "Pour ".s_span("Open Office","gvert").", le «vrai» fichier est ".href("content2.xml","content.xml") ;
00637 echo " ; pour ".s_span("Microsoft Office","gvert").", le «vrai» fichier utilise ".href("sheet1.xml","sheet1.xml") ;
00638 echo " et ".href("sharedStrings.xml","sharedStrings.xml")."." ;
00639 finp() ;
00640
00641 finsolution() ;
00642
00643 finblockquote() ;
00644
00645 ## -------------------------------------------------------------------------------------------
00646
00647 pvide() ;
00648
00649 ###########################################################################################
00650
00651 p() ;
00652 echo href("montresource.php?nomfic=l2xml_6_tp1.php","Code-source php de cette page","orange_stim nou")."." ;
00653 finp() ;
00654
00655 finSection() ;
00656
00657 if (!isset($_GET["standalone"])) { finPage() ; } ;
00658 ?>
Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.
Retour à la page principale de (gH)