Valid XHTML     Valid CSS2    

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 
;
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&eacute; d'Angers ") ;
00028     h2
(s_nbsp(4).href("../../","gilles.hunault@univ-angers.fr","gvert nou")) ;
00029     pvide
() ;
00030     h2
(s_span("T.P. num&eacute;ro $numSerie","gbleu")."&nbsp;:&nbsp;outils ligne de commandes et structuration $XML") ;
00031     pvide
() ;
00032     
00033     ###########################################################################################
00034     
00035     $tableauDesRubriques 
= array() ;
00036     $idr 
;
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 &agrave; $XHTML 1.0 Strict" ;
00040     $idr
++; $tableauDesRubriques[$idr] = "R&eacute;parer des fichiers mal form&eacute;s&nbsp;?" ;
00041     $idr
++; $tableauDesRubriques[$idr] = "Compter des ".ghBleu("&eacute;l&eacute;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   
;
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&eacute;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&eacute;s " 
;
00064     echo 
$recode$iconv$rxp$xmllint$xmlstarlet et $xsltproc sont install&eacute;s. " ;
00065     echo " On indiquera leur version respective et on lira l'aide en ligne afin d'en connaitre les param&egrave;tres. " 
;
00066     finp
() ;
00067     
00068     p
("texte") ;
00069     echo "O&ugrave; sont les pages d'aides associ&eacute;es sur le Web&nbsp;? " 
;
00070     finp
() ;
00071     
00072     p
("texte") ;
00073     echo "Rappeler comment on teste si un fichier est bien form&eacute; 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&eacute;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&nbsp;?" ;
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&ecirc;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&nbsp;: quel visualiseur de fichiers peut-on utiliser pour voir/afficher les fichiers 
$XML&nbsp;?" ;
00094      echo " Et quel éditeur de texte pour  éditer/afficher les fichiers 
$XML&nbsp;?" ;
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&agrave;") ;
00107     echo " (merci &agrave; M. Racine et R. Gaborieau de nous l'avoir signal&eacute;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&nbsp;: " ;
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")."&nbsp;: " ;
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&nbsp;" 
;
00130     finp
() ;
00131     
00132     pre_fichier
("outils-version.txt","cadre") ;
00133     
00134     p
("texte") ;
00135     echo " Voici les commandes &agrave; utiliser pour tester si un fichier est bien form&eacute;&nbsp;:" 
;
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&eacute; 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&egrave;tre "
.b("--help").". Pour $rxp l'aide est tr&egrave;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&nbsp;:" 
;
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 &agrave; l'aide d'un outil Web comme " 
;
00214     echo " le "
.href("https://validator.w3.org/","W3C validator").", " ;
00215     echo " d'un outil int&eacute;gr&eacute; &agrave; "
.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&nbsp;:" 
;
00220     finp
() ;
00221     
00222     ul
() ;
00223     
00224      debutli
() ; p() ;
00225       echo " il manque la structure englobante "
.b("html/head/body")."&nbsp;;" ;
00226      finp
() ; finli() ;
00227     
00228      debutli
() ; p() ;
00229       echo " il manque donc aussi l'&eacute;l&eacute;ment "
.b("title")." dans la partie ".b("head")."&nbsp;;" ;
00230      finp
() ; finli() ;
00231     
00232      debutli
() ; p() ;
00233       echo " le deuxi&egrave;me paragraphe qui commence en ligne 4 n'est pas ferm&eacute; car il n'y a pas de "
.b("&lt;/p&gt;")." correspondant &agrave; son ".b("&lt;p&gt;")."&nbsp;;" ;
00234      finp
() ; finli() ;
00235     
00236      debutli
() ; p() ;
00237       echo " toujours en ligne 4 l'entit&eacute; "
.b("&amp;nbsp")." est mal &eacute;crite, il manque un point-virgule en fin d'entit&eacute; &nbsp;;" ;
00238      finp
() ; finli() ;
00239     
00240      debutli
() ; p() ;
00241       echo " le lien pour Google est incorrect, il faut des guillemets autour de l'URL  &nbsp;;" 
;
00242      finp
() ; finli() ;
00243     
00244      debutli
() ; p() ;
00245       echo " le lien pour Google est un &eacute;l&eacute;ment "
.em(b("inline"))." et doit &ecirc;tre inclus dans un &eacute;l&eacute;ment de type ".b("boite") ;
00246       echo " comme par exemple un &eacute;l&eacute;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&eacute;e de la page et avec une indication explicite du jeu de caract&egrave;res utilis&eacute;." ;
00253     finp
() ;
00254     
00255     
00256     p
("texte") ;
00257     echo s_span
(b("Remarque&nbsp;:"),"grouge") ;
00258     echo " une page Web peut comporter autre chose que du "
.b("$HTML")."&nbsp;; " ;
00259     echo " ainsi les erreurs "
.b("$CSS")." et ".b("$JavaScript")." ne sont pas d&eacute;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 &agrave; XHTML 1.0 Strict
00269     
00270     ## -------------------------------------------------------------------------------------------
00271     
00272     blockquote
() ;
00273     
00274     p
("texte") ;
00275     echo " Quelles sont les principales diff&eacute;rences entre les grammaires "
.b("XHTML 1.0 Transitionnel")." et ".b("XHTML 1.0 Strict")."&nbsp;?" ;
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 &eacute;l&eacute;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&eacute;tails." ;
00289     finp
() ;
00290     
00291     p
("texte") ;
00292     echo "Passer de "
.b("XHTML 1.0 Transitionnel")." &agrave; ".b("XHTML 1.0 Strict")." peut &ecirc;tre parfois compliqu&eacute;. " ;
00293     echo " Ainsi pour d&eacute;marrer une liste avec l'ann&eacute;e courante (ici 2017), le code " 
;
00294     echo b
("&lt;ol&nbsp;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&eacute;n&eacute;ralise mal) " ;
00296     echo " soit on utilise du code Javascript pour r&eacute;aliser un "
.b("setAttribute(\"start\",\"2017\")").", ce qui rajoute des difficult&eacute;s..." ;
00297     finp
() ;
00298     
00299     finsolution
() ;
00300     
00301     finblockquote
() ;
00302     
00303     ## -------------------------------------------------------------------------------------------
00304     
00305     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # 4. R&eacute;parer des fichiers mal form&eacute;s
00306     
00307     ## -------------------------------------------------------------------------------------------
00308     
00309     blockquote
() ;
00310     
00311     p
("texte") ;
00312     echo " Indiquez pour chacun des fichiers suivant s'il est bien form&eacute; ou non. " 
;
00313     echo " Lorsqu'il n'est pas bien form&eacute;, 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")."&nbsp;: il est bien form&eacute;." ;
00322     finp
() ;
00323     
00324     p
("texte") ;
00325     echo "Il y a juste une erreur dans le fichier "
.href("fichier02.xml").". " ;
00326     echo " C'est &agrave; la ligne 723. On y trouve "
.b("&lt;xsd:sequence&nbsp;minOccurs=&nbsp;maxOccurs&gt;").". " ;
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 &agrave; moins de connaitre pr&eacute;cis&eacute;ment ce que sp&eacute;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&ecirc;me probl&egrave;me pour "
.href("fichier03.xml")."&nbsp;: il est mal form&eacute; car on a deux fois un m&ecirc;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&egrave;ve pas de comp&eacute;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 &agrave; la ligne 219, il manque "
.b("&lt;/NOM&gt;").". " ;
00341     echo " Ensuite, &agrave; la ligne 673, il manque un "
.b("P")." pour bien terminer l'&eacute;l&eacute;ment ".b("ACTPNOM").". "  ;
00342     echo " Enfin, &agrave; 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 &nbsp;: " 
;
00344     echo " les pr&eacute;noms sont &eacute;crits pour tous les autres acteurs avec l'&eacute;l&eacute;ment "
.b("ACTPNOM").". " ;
00345     echo " Or ici c'est l'&eacute;l&eacute;ment "
.b("ACTPRENOM")." qui est utilis&eacute;. Au final, le document sera bien form&eacute;, mais il ne sera pas valide si on d&eacute;finit dans une " ;
00346     echo " grammaire qu'on doit utiliser un &eacute;l&eacute;ment "
.b("ACTPNOM")." pour d&eacute;finir un pr&eacute;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 &eacute;l&eacute;ments et des attributs
00360     
00361     ## -------------------------------------------------------------------------------------------
00362     
00363     blockquote
() ;
00364     
00365     p
("texte") ;
00366     echo "Compter le nombre de lignes puis lister tous les &eacute;l&eacute;ments 
$XML distincts utilis&eacute;s dans le ".href("firefox.svg","logo du renard")." ci-dessous, puis " ;
00367     echo " compter tous les &eacute;l&eacute;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&eacute;resse ensuite au fichier "
.href("leadb880.xml")." suivant qui contient des donn&eacute;es pour des prot&eacute;ines " ;
00377     echo href
("../../Leadb","LEA","grouge")."&nbsp;:" ;
00378     finp
() ;
00379     
00380     p
() ;
00381     textarea_fichier
("leadb880","tajaunec",25,80,"leadb","leadb880.xml","") ;
00382     finp
() ;
00383     
00384     p
("texte") ;
00385     echo "Apr&egrave;s avoir d&eacute;crit la structure du fichier,  " 
;
00386     echo " compter le nombre de lignes, le nombre de lignes vides, d'&eacute;l&eacute;ments et d'attributs. " 
;
00387     echo " Vous pouvez utiliser tout outil logiciel qui vous parait adapt&eacute;. Comment trouver le nombre d'&eacute;l&eacute;ments distincts&nbsp;?" 
;
00388     finp
() ;
00389     
00390     p
("texte") ;
00391     echo " Quelles options des commandes "
.b("grep")." et ".b("sort")." devriez-vous r&eacute;viser au passage&nbsp;?" ;
00392     finp
() ;
00393     
00394     
00395     p
("texte") ;
00396     echo " Si vous &ecirc;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'&eacute;l&eacute;ments utilis&eacute;s pour le renard. Ainsi la commande " 
;
00407     echo b
("xmlstarlet el -u firefox.svg")." renvoie une liste de 26 &eacute;l&eacute;ments distincts dans l'arbre, pour 348 &eacute;l&eacute;ments en tout. " ;
00408     echo "Si on retire les &eacute;l&eacute;ments &eacute;gaux emboit&eacute;s comme g et g/g, il ne reste que 17 \"vrais\" &eacute;l&eacute;ments utilis&eacute;s&nbsp;:" 
;
00409     finp
() ;
00410     
00411     # manip pour produire firefox.elts :
00412     # xmlstarlet el -u > firefox.1
00413     # m&eacute;nage &agrave; 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&agrave; !
00417     
00418     pre_fichier
("firefox.elts","cadre") ;
00419     
00420     p
("texte") ;
00421     echo "Pour connaitre les attributs utilis&eacute;s et pour compter chacun des &eacute;l&eacute;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&eacute;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&amp;envoi=envoi","elementsRenard") ;
00424     echo " pour le v&eacute;rifier et lire les comptages. On peut aussi enchainer des commandes Unix&nbsp;:"  
;
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'&eacute;l&eacute;ment racine du fichier se nomme "
.b("proteins")." et il ne contient que " ;
00432     echo " des &eacute;l&eacute;ments nomm&eacute;s "
.b("protein").". Chaque &eacute;l&eacute;ment ".b("protein")." contient trois &eacute;l&eacute;ments, &agrave; savoir " ;
00433     echo b
("accession").", ".b("class")." et ".b("fasta").". De plus seul cet &eacute;l&eacute;ment ".b("fasta")." poss&egrave;de un attribut nomm&eacute; ".b("length").". " ;
00434     finp
();
00435     
00436     p
("texte") ;
00437     echo " Avec la commande "
.b("xmlstarlet&nbsp;el&nbsp;-u")." on dispose de la structure des donn&eacute;es en termes d'&eacute;l&eacute;ments&nbsp;:" ;
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&eacute;ter cette description des &eacute;l&eacute;ments et attributs." ;
00444     finp
();
00445     
00446     p
("texte") ;
00447     echo "On peut facilement obtenir le nombre de lignes avec la commande syst&egrave;me nomm&eacute;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'&eacute;lements distincts et la structure, ".b("xmlstarlet")." et ".b("trang")." sont des outils biens adapt&eacute;s. " ;
00450     echo 
" Pour le nombre d'&eacute;l&eacute;ments distincts et la structure, ".b("xmlstarlet")." est un outil biens adapt&eacute;. " ;
00451     echo " Enfin, pour le nombre d'&eacute;l&eacute;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&eacute;tail des commandes associ&eacute;es&nbsp;:" 
;
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&eacute;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&eacute;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'&eacute;l&eacute;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 &agrave; voir&nbsp;:" 
;
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'&eacute;l&eacute;ments&nbsp;:" ;
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 &eacute;l&eacute;ment pour l'ann&eacute;e, de naissance, le nom et le pr&eacute;nom. " 
;
00516     echo " Les films ont un &eacute;l&eacute;ment genre, mes (metteur en sc&egrave;ne), pays, r&eacute;sum&eacute; (sans accent), titre et un sous-arbre roles. " 
;
00517     echo " Cet &eacute;l&eacute;ment roles contient des &eacute;l&eacute;ments role (au singulier) avec un intitul&eacute;, un nom et un pr&eacute;nom." 
;
00518     finp
();
00519     
00520     p
("texte") ;
00521     echo "La commande suivante compl&eacute;te la description des &eacute;l&eacute;ments uniques " 
;
00522     echo " en chainant "
.b("xmlstarlet").", ".b("grep")." et ".b("sort")."&nbsp;:" ;
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&eacute;es et un fichier 
$XML sont des conteneurs&nbsp;? " ;
00544     finp
() ;
00545     
00546     p
("texte") ;
00547     echo "Ecrire le texte "
."&laquo;Bon ".b("courage")." &agrave; " ;
00548     echo s_span
("tous","bleu")." et &agrave; ".ghBleu("toutes")."&raquo; -- exactement comme cela, avec " ;
00549     echo em
("courage")." en gras, ".em("tous")." en bleu et ".em("toutes")." en gras et bleu fonc&eacute; -- " ;
00550     echo " dans un fichier Word au format "
.b("DOCX").", puis au format ".b("RTF")." ; " ;
00551     echo " &eacute;crire le m&ecirc;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 &eacute;diteur de texte&nbsp;? A quoi correspond le format "
.b(".FODT")."&nbsp;?" ;
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")."&nbsp;:" ;
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&eacute;es "
.ghVert("MySql").", un document ".ghRouge("XML").", un objet (au sens de la programmation objets) ou m&ecirc;me un ".b("DVD")." du commerce sont des " ;
00567     echo " conteneurs dans la mesure o&ugrave; ils permettent de regrouper des contenus (donn&eacute;es) h&eacute;t&eacute;rog&egrave;nes : une base de donn&eacute;es contient des tables qui elles-m&ecirc;mes contiennent des champs, " 
;
00568     echo " l'&eacute;l&eacute;ment racine du document 
$XML peut contenir d'autres &eacute;l&eacute;ments qui peuvent contenir eux-m&ecirc;mes d'autres &eacute;l&eacute;ments, " ;
00569     echo " un objet en "
.ghVert("PO")." peut contenir plusieurs variables-m&eacute;moires, voire plusieurs tableaux ou d'autres objets, " ;
00570     echo " un "
.b("DVD")." du commerce contient des vid&eacute;os, des sous-titres, voire des menus, des images... " ;
00571     echo " Ce qu'apportent en plus 
$XML et l'objet, c'est la possibilit&eacute; d'agir sur leurs contenus... " ;
00572     finp
() ;
00573     
00574     p
("texte") ;
00575     echo "On pourrait exporter une base de donn&eacute;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 &agrave; celle-ci)&nbsp;:" ;
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&eacute;s, c'est-&agrave;-dire des archives et ne peuvent donc pas &ecirc;tre lus directement. Seul le format ".ghVert(".RTF") ;
00584     echo " est lisible, si l'on peut dire. En voici le contenu&nbsp;:" 
;
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 &agrave; l'adresse "
.href("../courage.rtfste","courage.rtfste") ;
00591     echo " qui correspond &agrave; l'exercice 9 de nos exercices PHP "
.href("../tds.php","s&eacute;rie 1")." " ;
00592     echo "("
.href("../tds.php#cours1","&eacute;nonc&eacute;") ;
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","&eacute;nonc&eacute;").",".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&eacute;compresseur comme "
.b("unzip")." par exemple&nbsp;: " ;
00601     finp
() ;
00602     
00603     pre_fichier
("boncourage.listes.txt","cadre") ;
00604     
00605     p
("texte") ;
00606     echo "Les &laquo;vrais&raquo; fichiers pour "
.b("Open Office")." et ".b("Microsoft Office") ;
00607     echo " sont nomm&eacute;s respectivement "
.href("content.xml")." et ".href("document.xml","document.xml")."&nbsp;:" ;
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&ccedil;ais d&eacute;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 &laquo;&agrave; plat&raquo; (non compress&eacute;) monobloc (tout en un seul fichier). On pourra le v&eacute;rifier en consultant " 
;
00616     echo href
("boncourage.fodt")." (judicieusement recopi&eacute; en ".href("boncourage_fodt.xml").") dont le contenu est&nbsp;:" ;
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&eacute;limit&eacute; dont le s&eacute;parateur par d&eacute;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&ccedil;ais") ;
00624     echo " ne fournissent pas exactement les m&ecirc;mes informations sur ce format&nbsp;:" 
;
00625     finp
() ;
00626     
00627     pre_fichier
("tableur_data.csv.txt","cadre") ;
00628     
00629     p
("texte") ;
00630     echo "L&agrave; encore, les formats "
.s_span("ODS","gvert")." et ".s_span("XLSX","gvert")." correspondent &agrave; des archives de fichiers ".s_span("XML","grouge")."&nbsp;:" ;
00631     finp
() ;
00632     
00633     pre_fichier
("tableur_data.files.txt","cadre") ;
00634     
00635     p
("texte") ;
00636     echo "Pour "
.s_span("Open Office","gvert").", le &laquo;vrai&raquo; fichier est ".href("content2.xml","content.xml") ;
00637     echo "&nbsp;; pour "
.s_span("Microsoft Office","gvert").", le &laquo;vrai&raquo; 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 gH    Retour à la page principale de   (gH)