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
= 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&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
= 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 &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
= 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&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)