Valid XHTML     Valid CSS2    

Listing du fichier webrd01.php

 

00001     <?php
00002     error_reporting
(E_ALL | E_NOTICE | E_STRICT) ;
00003     include(
"std.php") ;
00004     include(
"../xmlstd.php") ;
00005     include(
"webrd_inc.php") ;
00006     
00007     
# (gH) -_- webrd01.php ; TimeStamp (unix) : 04 Octobre 2012 vers 14:50
00008     
00009     
debutPageWrd
(1) ;
00010     
00011     
$DTD
= rouge("DTD") ;
00012     
$XSD
= rouge("XSD") ;
00013     
$XML
= rouge("XML") ;
00014     
$xml
= rouge("xml") ;
00015     
$dtd
= rouge("dtd") ;
00016     
$xsd
= rouge("xsd") ;
00017     
$xsl
= rouge("xsl") ;
00018     
$VCARD
= rouge("VCARD") ;
00019     
$XCARD
= rouge("XCARD") ;
00020     
$Fasta
= rouge("Fasta") ;
00021     
$XSL
= rouge("XSL") ;
00022     
$HTML
= bleu("HTML") ;
00023     
$HTML5
= bleu("HTML5") ;
00024     
$XHTML
= bleu("XHTML") ;
00025     
00026     
## -------------------------------------------------------------------------------------------
00027     
00028     
sdl
(3) ; echo cmt(' pour afficher toutes les solutions : wedrd01.php?solutions=1') ; sdl(3) ;
00029     
00030     
## -------------------------------------------------------------------------------------------
00031     
00032     
debutSection() ;
00033     
00034     
$tableauDesRubriques = array() ;
00035     
$idr
= 0 ;
00036     
$idr
++; $tableauDesRubriques[$idr] = "Installation des outils logiciels" ;
00037     
$idr
++; $tableauDesRubriques[$idr] = "Structuration de services" ;
00038     
$idr
++; $tableauDesRubriques[$idr] = "Structuration de personnes, $VCARD et $XCARD" ;
00039     
$idr
++; $tableauDesRubriques[$idr] = "Structuration de séquences $Fasta" ;
00040     
$idr
++; $tableauDesRubriques[$idr] = "Structuration de personnes et de services " ;
00041     
$idr
++; $tableauDesRubriques[$idr] = "Formats $XML usuels en bureautique" ;
00042     
$idr
++; $tableauDesRubriques[$idr] = "Formats $XML usuels en bioinformatique" ;
00043     
$idr
++; $tableauDesRubriques[$idr] = "Bases de données et $XML ; espaces de noms" ;
00044     
$idr
++; $tableauDesRubriques[$idr] = "Dessins et rendus $XML" ;
00045     
$idr
++; $tableauDesRubriques[$idr] = "Lecture de fichiers $XML sur Internet et logiciel $R" ;
00046     
$idr
++; $tableauDesRubriques[$idr] = "Questions diverses " ;
00047     
$idr
++; $tableauDesRubriques[$idr] =
00048     
$tdmCRLM
= new tdm($tableauDesRubriques) ;
00049     
$tdmCRLM
->titre() ;
00050     
$tdmCRLM
->menu("oui","oui","nou") ;
00051     
00052     
pvide() ;
00053     
00054     
p() ;
00055      echo
"Il est possible d'afficher toutes les solutions via " ;
00056      echo
href
("webrd01.php?solutions=1","?solutions=1","bouton_fin jaune_pastel nou")." " ;
00057      echo
" et de les masquer avec " ;
00058      echo
href
("webrd01.php?solutions=0","?solutions=0","bouton_fin vert_pastel nou").". " ;
00059     
finp() ;
00060     
00061     
finSection() ;
00062     
00063     
debutSection() ;
00064     
$numExo
= 0 ;
00065     
00066     
## -------------------------------------------------------------------------------------------
00067     
00068     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Installation des outils logiciels
00069     
00070     ## -------------------------------------------------------------------------------------------
00071     
00072     
blockquote() ;
00073     
00074     
p
("texte") ;
00075     echo
"Installer sous Linux les outils en ligne de commande nommés " ;
00076     echo
vert
("recode").", ".vert("rxp").", ".vert("xmllint") ;
00077     echo
", "
.vert("xmlstarlet").", ".vert("xsltproc")." puis les modules ";
00078     echo
rouge
("XML::Parser").", " ;
00079     echo
rouge
("XML::Checker").", " ;
00080     echo
rouge
("XML::SAX").", " ;
00081     echo
rouge
("XML::Validator::Schema")." et " ;
00082     echo
rouge
("XML::XSLT")." pour ".href("../tuteurs/tutperl.htm","perl").". " ;
00083     
finp() ;
00084     
00085     
p
("texte") ;
00086     echo
"Où sont les pages d'aides associées ? " ;
00087     
finp() ;
00088     
00089     
p
("texte") ;
00090     echo
"Vérifier que le script "
.href("montresource.php?nomfic=demoXml","demoXml") ;
00091     echo
" fourni dans l'archive "
.href("demoXml.zip")." fournit les mêmes résultats que dans le listing " ;
00092     echo
" de sortie "
.href("montresource.php?nomfic=demoXmlTxt.txt","demoXml.txt")." et que vous " ;
00093     echo
" comprenez les affichages. On pourra essayer de retenir les principales options des outils en ligne de commande. " ;
00094     echo
" On utilisera bien sûr les fichiers suivants&nbsp;: " ;
00095     
finp() ;
00096     
00097     
blockquote() ;
00098     
table
(1,7,"collapse") ;
00099     
tr() ;
00100     
th
() ; echo "Fichier" ; finth() ;
00101     
th
() ; echo "Explications" ; finth() ;
00102     
fintr() ;
00103     
tr() ;
00104     
td
() ; echo href("dbf.xml") ; fintd() ;
00105     
td
() ; echo "fichier $xml bien formé" ; fintd() ;
00106     
fintr() ;
00107     
tr() ;
00108     
td
() ; echo href("dmf.xml") ; fintd() ;
00109     
td
() ; echo "fichier $xml mal formé" ; fintd() ;
00110     
fintr() ;
00111     
tr() ;
00112     
td
() ; echo href("adv.xml") ; fintd() ;
00113     
td
() ; echo "fichier $xml valide pour la grammaire id.$dtd" ; fintd() ;
00114     
fintr() ;
00115     
tr() ;
00116     
td
() ; echo href("adn.xml") ; fintd() ;
00117     
td
() ; echo "fichier $xml invalide pour la grammaire id.$dtd" ; fintd() ;
00118     
fintr() ;
00119     
tr() ;
00120     
td
() ; echo href("id.dtd") ; fintd() ;
00121     
td
() ; echo "fichier grammaire de type $dtd" ; fintd() ;
00122     
fintr() ;
00123     
tr() ;
00124     
td
() ; echo href("axv.xml") ; fintd() ;
00125     
td
() ; echo "fichier $xml valide pour la grammaire id.$xsd" ; fintd() ;
00126     
fintr() ;
00127     
tr() ;
00128     
td
() ; echo href("axn.xml") ; fintd() ;
00129     
td
() ; echo "fichier $xml invalide pour la grammaire id.$xsd" ; fintd() ;
00130     
fintr() ;
00131     
tr() ;
00132     
td
() ; echo href("id.xsd") ; fintd() ;
00133     
td
() ; echo "fichier grammaire de type $xsd (schéma)" ; fintd() ;
00134     
fintr() ;
00135     
tr() ;
00136     
td
() ; echo href("cours.xml") ; fintd() ;
00137     
td
() ; echo "fichier $xml auquel appliquer la transformation .$xsl" ; fintd() ;
00138     
fintr() ;
00139     
tr() ;
00140     
td
() ; echo href("cours.xsl") ; fintd() ;
00141     
td
() ; echo "fichier $xml qui est une transformation $xsl" ; fintd() ;
00142     
fintr() ;
00143     
fintable() ;
00144     
finblockquote() ;
00145     
00146     
p
("texte") ;
00147     echo
"Ecrire un script "
.b("iso2utf")." et un script ".b("utf2iso")." pour convertir les accents à l'aide de recode (plutôt que iconv). " ;
00148     
finp() ;
00149     
00150     
p
("texte") ;
00151     echo
" Tester ces scripts avec les fichiers " ;
00152     echo
href
("accentsIso.txt").", " ;
00153     echo
href
("accentsHtml.txt")." et " ;
00154     echo
href
("accentsUtf.txt").". " ;
00155     echo
"Un fichier plus complet en iso est "
.href("allcharIso.txt").". " ;
00156     
finp() ;
00157     
00158     
solution
($numExo) ;
00159     
00160     
p() ;
00161     echo
"Pour "
.b("rxp").", on peut exécuter ".b("sudo apt-get install rxp").". " ;
00162     
br() ;
00163     echo
"La page officielle pour rxp est " ;
00164     echo
href
("http://www.cogsci.ed.ac.uk/~richard/rxp.html").". " ;
00165     echo
"La page d'aide (man) est "
.href("http://www.cogsci.ed.ac.uk/~richard/rxp.txt")." dont " ;
00166     echo
" une version un peu plus lisible est "
.href("rxp_help.html","ici").". " ;
00167     echo
" Une autre page d'aide est " ;
00168     echo
href
("https://www.spec.org/mpi/docs/specrxp.html","là") ;
00169     echo
" (merci à M. Racine et R. Gaborieau de nous l'avoir signalée)." ;
00170     
finp() ;
00171     
00172     
p() ;
00173     echo
b
("xmllint")." fait partie du package ".b("libxml2-utils").", installable aussi par ".b("apt-get")." ou via " ;
00174     echo
href
("http://xmlsoft.org").". " ;
00175     echo
"La page d'aide est "
.href("http://xmlsoft.org/xmllint.html").". " ;
00176     
finp() ;
00177     
00178     
p() ;
00179     echo
"On peut trouver " ;
00180     echo
"la page d'aide pour "
.b("xmlstarlet")." sur sourceforge&nbsp;: " ;
00181     echo
href
("http://xmlstar.sourceforge.net/doc/UG/xmlstarlet-ug.html","xmlstarlet-ug.html").". " ;
00182     
finp() ;
00183     
00184     
p() ;
00185     echo
"On peut trouver " ;
00186     echo
"la page d'aide pour "
.b("xsltproc")." sur le site ".b("xmlsoft")."&nbsp;: " ;
00187     echo
href
("http://xmlsoft.org/XSLT/xsltproc2.html","xsltproc2.html").". " ;
00188     
finp() ;
00189     
00190     
p() ;
00191     echo
"Pour perl, installer le module MMM peut se faire en ligne de commande via "
.b("sudo perl -MCPAN -e 'install MODULE::MMM'").". " ; br() ;
00192     echo
" Voir le détail des commentaires en haut du fichier " ;
00193     echo
href
("montresource.php?nomfic=demoXml","demoXml").". " ;
00194     
finp() ;
00195     
00196     
00197     
p() ;
00198     echo
"La syntaxe de " ;
00199     echo
href
("recode_list.txt","recode").", " ;
00200     echo
" qu'on installe par "
.b("apt-get") ;
00201     echo
" est la suivante&nbsp;: " ;
00202     echo
b
("recode ISO-8859-15..UTF8 fichier").". " ;
00203     
finp() ;
00204     
00205     
p() ;
00206     echo
"La syntaxe de " ;
00207     echo
href
("iconv_list.txt","iconv") ;
00208     echo
" qu'on installe par "
.b("sudo apt-get install libc-bin")." " ;
00209     echo
" est la suivante&nbsp;: " ;
00210     echo
b
("iconv -f ISO_8859-15 -t UTF-8 fichier_original &gt; fichier_modifié").". " ;
00211     
finp() ;
00212     
00213     
p() ;
00214     echo
"Le script " ;
00215     echo
b
("iso2utf") ;
00216     echo
" est donc tout simplement le fichier qui contient " ;
00217     echo
b
("recode ISO-8859-15..UTF8 \$1")." rendu exécutable par " ;
00218     echo
b
("chmod +x").". " ;
00219     
finp() ;
00220     
00221     
p() ;
00222     echo
"Pour être sûr que tout est bien installé, il faut exécuter les commandes suivantes " ;
00223     
finp() ;
00224     
00225     
pre_fichier
("cmd_install.txt","cadre") ;
00226     
00227     
finsolution() ;
00228     
00229     
finblockquote() ;
00230     
00231     
## -------------------------------------------------------------------------------------------
00232     
00233     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Structuration de services
00234     
00235     ## -------------------------------------------------------------------------------------------
00236     
00237     
blockquote() ;
00238     
00239     
p
("texte") ;
00240     echo
"On veut modéliser des services dans une entreprise comme " ;
00241     echo
em
("Achats").", " ;
00242     echo
em
("Direction").", " ;
00243     echo
em
("Courrier")."..." ;
00244     echo
" Ecrire le fichier "
.b("serv00.xml")." défini à l'aide des seuls éléments ".s_span("services","gbleu")." et ".s_span("service","gbleu")." ; " ;
00245     echo
" les noms de services seront intégrés comme des contenus-texte d'éléments. Comment vérifier que " ;
00246     echo
" le fichier est bien formé&nbsp;? Ajouter le service "
.em("Représentation")." après avoir remarqué qu'il " ;
00247     echo
" y a un caractère accentué. On nommera "
.b("serv01.xml")." le fichier avec accent. " ;
00248     
finp() ;
00249     
00250     
p
("texte") ;
00251     echo
" Ecrire le fichier "
.b("serv02.xml")." défini à l'aide des éléments ".s_span("services","gbleu")." et ".s_span("service","gbleu")." " ;
00252     echo
" et du sous-élément "
.s_span("nomDeService","gbleu")." dont le contenu-texte est un nom de service " ;
00253     echo
" puis écrire le fichier "
.b("serv03.xml")." défini à l'aide des éléments ".s_span("services","gbleu")." et ".s_span("service","gbleu")." " ;
00254     echo
" et de l'attribut "
.s_span("nomDeService","gvert")."." ;
00255     
finp() ;
00256     
00257     
p
("texte") ;
00258     echo
"On décide maintenant d'ajouter un identifiant de service (comme pour une base de données). Faut-il utiliser " ;
00259     echo
" l'initiale des services ou un entier auto-incrémenté&nbsp;? Si on nomme "
.s_span("numService","grouge")." cette donnée, comment l'implémenter&nbsp;? " ;
00260     echo
" Vous écrirez dans "
.b("serv04.xml")." à partir de ".b("serv02.xml")." la solution avec sous-élément et " ;
00261     echo
" dans "
.b("serv05.xml")." la solution avec attribut. " ;
00262     echo
" Y a-t-il pour l'instant une meilleure solution&nbsp;? " ;
00263     
finp() ;
00264     
00265     
solution
($numExo) ;
00266     
00267     
p() ;
00268     echo
"Voici les fichiers solutions&nbsp;: " ;
00269     
finp() ;
00270     
00271     
$tabExpl = Array() ;
00272     
$tabExpl
[0] = "fichier sans accent et sans sous structure" ;
00273     
$tabExpl
[1] = "fichier avec accent et sans sous structure" ;
00274     
$tabExpl
[2] = "fichier avec sous-structure en élément" ;
00275     
$tabExpl
[3] = "fichier avec sous-structure en attribut" ;
00276     
$tabExpl
[4] = "complément de serv02.xml avec numéro de service en élément" ;
00277     
$tabExpl
[5] = "complément de serv02.xml avec numéro de service en attribut" ;
00278     
00279     
blockquote() ;
00280     
table
(1,7,"collapse") ;
00281     
tr() ;
00282     
th
() ; echo "Fichier" ; finth() ;
00283     
th
() ; echo "Explications" ; finth() ;
00284     
fintr() ;
00285      for (
$ndf
=0;$ndf<=5;$ndf++) {
00286     
tr() ;
00287     
td
() ; echo href("serv0$ndf.xml") ; fintd() ;
00288     
td
() ; echo $tabExpl[$ndf] ; fintd() ;
00289     
fintr() ;
00290      } ;
# fin pour
00291     
fintable() ;
00292     
finblockquote() ;
00293     
00294     
montre
(0,5,"serv","visu1") ;
00295     
00296     
p() ;
00297     echo
b
("Quelques remarques") ;
00298     
finp() ;
00299     
00300     
p
("texte") ;
00301     echo
"Il est conseillé, lorsqu'on écrit un fichier
$XML &laquo;à la main&raquo; sous éditeur, d'adopter un standard d'écriture. " ;
00302     echo
" Ainsi, dans "
.href("serv00.xml")." et ".href("serv02.xml").", il est maladroit de mettre des retours-charriot uniquement pour le service ".b("Courrier").". " ;
00303     
finp() ;
00304     
00305     
p
("texte") ;
00306     echo
"L'écriture de "
.href("serv03.xml")." est encore plus maladroite&nbsp;: il existe deux façons de coder des éléments auto-fermants et il vaut mieux utiliser toujours le m&ecirc;me " ;
00307     echo
" m&ecirc;me codage à l'intérieur d'un m&ecirc;me fichier. De plus il doit en principe y avoir un espace devant le symbole / si on utilise le codage court, ce qui " ;
00308     echo
" n'est pas le cas pour le service "
.b("Direction")." où le / est collé au symbole guillemet du nom de l'attribut. " ;
00309     
finp() ;
00310     
00311     
p
("texte") ;
00312     echo
"Pour l'instant, le fichier "
.href("serv04.xml")." est correct, mais il est clair qu'avoir utilisé ".b("3r")." comme numéro de service pour ".b("Courrier")." est sans doute " ;
00313     echo
" une faute de frappe, non détectable sans typage des numéros de service, d'où l'utilité des grammaires. " ;
00314     echo
" Par contre, le choix d'un numéro ou d'une lettre est ici peu important, m&ecirc;me si une initiale risque d'apparaitre plusieurs fois, ce qui ne permettra pas d'en faire un " ;
00315     echo
" index. On verra plus tard comment définir par grammaire des identifiants et des références à des identifiants. " ;
00316     echo
" On remarquera que nous avons volontairement dupliqué le service "
.b("Direction")." ce qui constitue une erreur, non détectable à ce niveau ; la cardinalité ".b("unique") ;
00317     echo
" sera, elle aussi, prise en compte par les grammaires. " ;
00318     
finp() ;
00319     
00320     
p
("texte") ;
00321     echo
"Pour vérifier que les fichiers
$XML sont bien formés, on peut bien s&ucirc;r utiliser rxp, xmllint, xmlstarlet ou se contenter de cliquer sur les liens fournis " ;
00322     echo
" car les navigateurs vérifient les fichiers
$XML (contrairement aux fichiers HTML, y compris XHTML) et ne les affichent que s'ils sont bien formés. " ;
00323     
finp() ;
00324     
00325     
finsolution() ;
00326     
00327     
finblockquote() ;
00328     
00329     
## -------------------------------------------------------------------------------------------
00330     
00331     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Structuration de personnes
00332     
00333     ## -------------------------------------------------------------------------------------------
00334     
00335     
blockquote() ;
00336     
00337     
p
("texte") ;
00338     echo
"On admettra qu'on peut définir sommairement une personne par " ;
00339     echo
" un "
.s_span("nom","grouge").", un ".s_span("prénom","grouge")." et une ".s_span("ddn","grouge")." (date de naissance) que l'on réduira pour l'instant " ;
00340     echo
" à une année de naissance. Ecrire, à partir des éléments "
.s_span("personnes","gbleu")." et ".s_span("personne","gbleu")." dans le fichier " ;
00341     echo
b
("pers01.xml") ;
00342     echo
" une solution "
.s_span("tout élément","gbleu")." puis dans " ;
00343     echo
b
("pers02.xml") ;
00344     echo
" une solution "
.s_span("tout attribut","gbleu").". Enfin, écrire dans " ;
00345     echo
b
("pers03.xml") ;
00346     echo
" une solution &laquo;panachée&raquo; où "
.eltb("nom")." et ".eltb("prénom")." sont des éléments et où ".attv("ddn")." est un attribut. " ;
00347     
finp() ;
00348     
00349     
p
("texte") ;
00350     echo
"On insérera les personnes Isabelle DUPUIS, née en 1965, Jean DUPONT, né en 1963, Jack DUPONT, né en 1968. " ;
00351     
finp() ;
00352     
00353     
p
("texte") ;
00354     echo
"Peut-on avoir à la fois un "
.eltb("élément")." ddn et un ".attv("attribut")." ddn&nbsp;? " ;
00355     
finp() ;
00356     
00357     
p
("texte") ;
00358     echo
"Y a-t-il une structuration meilleure qu'une autre pour cet exemple&nbsp;? " ;
00359     
finp() ;
00360     
00361     
p
("texte") ;
00362     echo
"Qu'est-ce que "
.b("XCARD")."&nbsp;? Quel rapport avec ".b("VCARD")." et ".b("XML")."&nbsp;? " ;
00363     echo
" Que sont "
.rouge("RFC-6350")." et ".rouge("RFC-63511")."&nbsp;? " ;
00364     
finp() ;
00365     
00366     
solution
($numExo) ;
00367     
00368     
p() ;
00369     echo
"Voici les fichiers demandés ; le quatrième fichier comporte un élément et un attribut de m&ecirc;me nom, ce qui n'est pas recommandé." ;
00370     
finp() ;
00371     
00372     
montre
(1,4,"pers","visu2") ;
00373     
00374     
p
("texte") ;
00375     echo
"Pour cet exemple, il n'y a probablement pas de meilleure solution. On peut juste remarquer que la solution avec des " ;
00376     echo
" attributs seulement est plus concise et sans doute plus facile à lire. " ;
00377     
finp() ;
00378     
00379     
p
("texte") ;
00380     echo
"VCARD signifie Visit Card, soit carte de visite en français. Il s'agit d'un format ouvert de données sur des personnes, beaucoup plus " ;
00381     echo
" complet que notre simple exemple avec nom, prénom et ddn. Une présentation courte en est fournie sur le wiki français " ;
00382     echo
" à l'adresse "
.href(wikifr("VCard"))." mais la version anglaise " ;
00383     echo
href
(wikien("VCard"))." est plus détaillée. On y apprend que " ;
00384     echo
href
("http://tools.ietf.org/html/rfc6350","RFC6350")." décrit ce que contient une VCARD et que " ;
00385     echo
href
("http://tools.ietf.org/html/rfc6351","XCARD")." est la version $XML de VCARD. " ;
00386     echo
b
("RFC6351")." est un ".href(wikifr("Request_for_comments"),"&laquo;appel à commentaires&raquo;")." qui décrit ce format XCARD. " ;
00387     
finp() ;
00388     
00389     
p
("texte") ;
00390     echo
"En fait, XCARD permet d'avoir un carnet d'adresses, chaque personne étant représentée par sa carte de visite. L'élément racine est " ;
00391     echo
" nommé "
.bleu("vcards")." (noter le ".s_span("s","gvert")." à la fin) et chaque carte de visite correspond à un élément ".bleu("vcard")." (donc sans ".s_span("s","gvert")." en fin)." ;
00392     echo
" On pourra remarquer que le nom, le surnom, etc. sont structurés en tant qu'"
.bleu("éléments").", pas en tant qu'".bleu("attributs").". " ;
00393     echo
" Voici une partie d'un fichier XCARD extrait de la RFC6351&nbsp;: " ;
00394     
finp() ;
00395     
00396     
pre_fichier
("xmpxcard.txt","cadre") ;
00397     
00398     
p
("texte") ;
00399     echo
b
("RFC63511")." n'existe pas. Il s'agit d'un faute de frappe (volontaire) pour ". b("RFC6351")."." ;
00400     
finp() ;
00401     
00402     
finsolution() ;
00403     
00404     
finblockquote() ;
00405     
00406     
## -------------------------------------------------------------------------------------------
00407     
00408     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Structuration de séquences Fasta
00409     
00410     ## -------------------------------------------------------------------------------------------
00411     
00412     
blockquote() ;
00413     
00414     
p
("texte") ;
00415     echo
"Une "
.href("http://fr.wikipedia.org/wiki/FASTA","séquence Fasta")." traditionnelle se compose d'un identifiant comme " ;
00416     echo
href
("http://www.ncbi.nlm.nih.gov/protein/159163650","1YYCA") ;
00417     echo
" et d'une suite d'"
.href("http://fr.wikipedia.org/wiki/Acide_amin%C3%A9","acides aminés")." comme ".b("VKGFFAECKLA")." ou de " ;
00418     echo
href
("http://fr.wikipedia.org/wiki/Nucl%C3%A9otide","nucléotides")." comme ".b("TATAAGCCTGCCAAGC").". " ;
00419     echo
" On se restreint pour ce qui suit aux protéines (définies comme des suites d'acides aminés). " ;
00420     echo
" Si on nomme "
.datar("id")." et ".datar("aa")." les données, " ;
00421     echo
" comment structurer dans un fichier "
.rouge("XML")." ces informations&nbsp;? " ;
00422     echo
" On pourra utiliser le fichier texte "
.href("fasta_xmp.txt")." pour constituer un fichier ".rouge("XML")." de 3 séquences Fasta. " ;
00423     
finp() ;
00424     
00425     
p() ;
00426     echo
"Que peut-on ajouter comme aide à la vérification&nbsp;? Sous quelle forme, élément ou attribut&nbsp;? " ;
00427     
finp() ;
00428     
00429     
solution
($numExo) ;
00430     
00431     
p
("texte") ;
00432     echo
"A l'aide des exercices précédents, on peut raisonnablement implémenter une solution tout élément ("
.href("fasta01.xml")."), " ;
00433     echo
" une solution tout attribut ("
.href("fasta02.xml")."), " ;
00434     echo
" ou une solution &laquo;panachée&raquo; ("
.href("fasta03.xml")."). " ;
00435     echo
" Ajouter un élément longueur ("
.href("fasta04.xml").") ou un attribut longueur (".href("fasta05.xml")."), " ;
00436     echo
" pourrait constituter une vérification utile, quand on connait les longueurs usuelles des séquences Fasta, " ;
00437     echo
" ce qui statistiquement n'est pas si simple que cela... " ;
00438     
finp() ;
00439     
00440     
montre
(1,5,"fasta","visu3") ;
00441     
00442     
finsolution() ;
00443     
00444     
finblockquote() ;
00445     
00446     
## -------------------------------------------------------------------------------------------
00447     
00448     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Structuration de personnes et de services
00449     
00450     ## -------------------------------------------------------------------------------------------
00451     
00452     
blockquote() ;
00453     
00454     
p
("texte") ;
00455     echo
"Ecrire dans " ;
00456     echo
b
("agence01.xml") ;
00457     echo
" une solution "
.eltb("tout élément")." qui intégre un fichier ".rouge("XML")." de personnes (auquel on aura ajouté un numéro de service nommé ".datar("numService").")" ;
00458     echo
" et un fichier "
.rouge("XML")." de services puis fournir dans " ;
00459     echo
b
("agences02.xml") ;
00460     echo
" une solution "
.attv("tout attribut").". " ;
00461     echo
"On pourra utiliser " ;
00462     echo
href
("pers06.xml")." et ".href("serv06.xml")." pour constituer ".href("agences01.xml") ;
00463     echo
" puis " ;
00464     echo
href
("pers07.xml")." et ".href("serv07.xml")." pour constituer ".href("agences02.xml") ;
00465     echo
". " ;
00466     
finp() ;
00467     
00468     
solution
($numExo) ;
00469     
00470     
p
("texte") ;
00471     echo
"On peut bien évidemment faire un \"copier/coller\" les fichiers de personnes et de services dans un fichier agence " ;
00472     echo
"("
.href("agences01.xml").", ".href("agences02.xml")."), mais il est sans doute mieux de les inclure via une ".rouge("DTD").", soit les " ;
00473     echo
" fichiers "
.href("agences03.xml")." et ".href("agences04.xml").". " ;
00474     
finp() ;
00475     
00476     
montre
(1,4,"agences","visu4") ;
00477     
00478     
p
("texte") ;
00479     echo
"Il est possible de vérifier que les inclusions sont effectives et valides à l'aide de "
.b("rxp").", ".b("xmllint")." ou ".b("xmlstarlet")."&nbsp;:" ;
00480     
finp() ;
00481     
00482     
pre_fichier
("agences.txt","cadre") ;
00483     
00484     
finsolution() ;
00485     
00486     
finblockquote() ;
00487     
00488     
## -------------------------------------------------------------------------------------------
00489     
00490     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Formats XML usuels en bureautique
00491     
00492     ## -------------------------------------------------------------------------------------------
00493     
00494     
blockquote() ;
00495     
00496     
p
("texte") ;
00497     echo
"Dans quelle mesure peut-on dire qu'un fichier-archive, une base de données et un fichier "
.rouge("XML")." sont des conteneurs&nbsp;? " ;
00498     
finp() ;
00499     
00500     
p
("texte") ;
00501     echo
"Ecrire le texte "
."&laquo;Bon ".b("courage")." à " ;
00502     echo
s_span
("tous","bleu")." et à ".bleu("toutes")."&raquo; -- exactement comme cela, avec " ;
00503     echo
em
("courage")." en gras, ".em("tous")." en bleu et ".em("toutes")." en gras et bleu foncé -- " ;
00504     echo
" dans un fichier Word au format "
.b("DOCX").", puis au format ".b("RTF")." ; " ;
00505     echo
" écrire le m&ecirc;me texte dans un fichier Libre Office au format "
.b("Texte ODT").". Si ce sont des fichiers ".bleu("XML").", pourquoi ne peut-on pas les " ;
00506     echo
" ouvrir directement avec un éditeur de texte&nbsp;? A quoi correspond le format "
.b(".FODT")."&nbsp;?" ;
00507     
finp() ;
00508     
00509     
p
("texte") ;
00510     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 " ;
00511     echo
vert
("XLSX").", ".vert("CSV")." et ".vert("Classeur ODS")."&nbsp;:" ;
00512     
finp() ;
00513     
00514     
pre_fichier
("tableur_data.txt","cadre") ;
00515     
00516     
solution
($numExo) ;
00517     
00518     
p
("texte") ;
00519     echo
" Un fichier-archive, " ;
00520     echo
" une base de données "
.vert("MySql").", un document ".rouge("XML").", un objet (au sens de la programmation objets) ou même un ".b("DVD")." du commerce sont des " ;
00521     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 elle-mêmes contiennent des champs, " ;
00522     echo
" l'élément racine du document "
.rouge("XML")." peut contenir d'autres éléments qui peuvent contenir eux-mêmes d'autres éléments, " ;
00523     echo
" un objet en "
.vert("PO")." peut contenir plusieurs variables-mémoires, voire plusieurs tableaux ou d'autres objets, " ;
00524     echo
" un "
.b("DVD")." du commerce contient des vidéos, des sous-titres, voire des menus, des images... " ;
00525     echo
" Ce qu'apporte en plus "
.rouge("XML")." et l'objet, c'est la possibilité d'agir sur leurs contenus... " ;
00526     
finp() ;
00527     
00528     
p
("texte") ;
00529     echo
"On pourrait exporter une base de données en "
.rouge("XML")." avec la structure suivante " ;
00530     echo
" ("
.vert("MySql")." dispose d'une ".href("../internet/mysqlhlp.txt","option de sortie")." ".vert("HTML")." et d'une ".href("../internet/mysqlman.txt","option de sortie")." ".rouge("XML")." qui ressemble un peu à celle-ci)&nbsp;:" ;
00531     
finp() ;
00532     
00533     
pre_fichier
("mysqlEnXml.txt","cadre") ;
00534     
00535     
p
("texte") ;
00536     echo
"Les fichiers "
.vert(".ODS")." et ".vert(".DOCX")." sont des documents compressés, c'est-à-dire des archives et ne peuvent donc pas &ecirc;tre lus directement. Seul le format ".vert(".RTF") ;
00537     echo
" est lisible, si l'on peut dire. En voici le contenu&nbsp;:" ;
00538     
finp() ;
00539     
00540     
pre_fichier
("boncourage.rtf","cadre") ;
00541     
00542     
00543     
p
("texte") ;
00544     echo
"Un afffichage plus lisible pour un fichier similaire se trouve à l'adresse "
.href("../internet/courage.rtfste","courage.rtfste") ;
00545     echo
" qui correspond à l'exercice 9 de nos exercices PHP "
.href("../internet/tds.php","série 1")." " ;
00546     echo
"("
.href("../internet/tds.php#cours1","énoncé") ;
00547     echo
", "
.href("../internet/solutions.php#cours1","solution").")." ;
00548     echo
" On pourra aussi consulter l'exercice 1 de notre cours " ;
00549     echo
href
("../Farcompr/sac.htm","FarCompr").", partie stockage " ;
00550     echo
" ("
.href("../Farcompr/sacex.htm#p1","énoncé").",".href("../Farcompr/sacor.htm#p1","solution")."). " ;
00551     
finp() ;
00552     
00553     
p
("texte") ;
00554     echo
"Pour retrouver les fichiers des archives, il suffit d'utiliser un décompresseur comme "
.b("unzip")." par exemple&nbsp;: " ;
00555     
finp() ;
00556     
00557     
pre_fichier
("boncourage.listes.txt","cadre") ;
00558     
00559     
p
("texte") ;
00560     echo
"Les &laquo;vrais&raquo; fichiers pour "
.b("Open Office")." et ".b("Microsoft Office") ;
00561     echo
" sont nommés respectivement "
.href("content.xml")." et ".href("word/document.xml","document.xml")."&nbsp;:" ;
00562     
finp() ;
00563     
00564     
pre_fichier
("boncourage.files.txt","cadre") ;
00565     
00566     
p
("texte") ;
00567     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").", ";
00568     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") ;
00569     echo
" du Wiki anglais explique qu'il s'agit d'un format &laquo;à plat&raquo; (non compressé) monobloc (tout en un seul fichier). On pourra le vérifier en consultant " ;
00570     echo
href
("boncourage.fodt")." (judicieusement recopié en ".href("boncourage_fodt.xml").") dont le contenu est&nbsp;:" ;
00571     
finp() ;
00572     
00573     
pre_fichier
("boncourage.fodt.txt","cadre") ;
00574     
00575     
p
("texte") ;
00576     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. " ;
00577     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") ;
00578     echo
" ne fournissent pas exactement les m&ecirc;mes informations sur ce format&nbsp;:" ;
00579     
finp() ;
00580     
00581     
pre_fichier
("tableur_data.csv.txt","cadre") ;
00582     
00583     
p
("texte") ;
00584     echo
"Là encore, les formats "
.s_span("ODS","gvert")." et ".s_span("XLSX","gvert")." correspondent à des archives de fichiers ".s_span("XML","grouge")."&nbsp;:" ;
00585     
finp() ;
00586     
00587     
pre_fichier
("tableur_data.files.txt","cadre") ;
00588     
00589     
p
("texte") ;
00590     echo
"Pour "
.s_span("Open Office","gvert").", le &laquo;vrai&raquo; fichier est ".href("Ods/content.xml","content.xml") ;
00591     echo
"&nbsp;; pour "
.s_span("Microsoft Office","gvert").", le &laquo;vrai&raquo; fichier utilise ".href("Excel/xl/worksheets/sheet1.xml","sheet1.xml") ;
00592     echo
" et "
.href("Excel/xl/sharedStrings.xml","sharedStrings.xml")."." ;
00593     
finp() ;
00594     
00595     
finsolution() ;
00596     
00597     
finblockquote() ;
00598     
00599     
## -------------------------------------------------------------------------------------------
00600     
00601     
00602     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Formats XML usuels en bioinformatique
00603     
00604     ## -------------------------------------------------------------------------------------------
00605     
00606     
blockquote() ;
00607     
00608     
00609     
p
("texte") ;
00610     echo
"Le "
.bleu("NCBI")." est un institut national américain qui fournit de nombreuses ressources en bioinformatique. " ;
00611     echo
"Cherchez sur la page principale du site dans la base de données des protéines, le mot "
.b("AAA18335")." puis le mot ".b("424143").". " ;
00612     echo
"Comment est affichée la séquence en acides aminés de la protéine correspondante&nbsp;? " ;
00613     
finp() ;
00614     
00615     
p
("texte") ;
00616     echo
"Afin d'éviter d'encombrer les serveurs, le "
.bleu("NCBI")." propose un script pour accéder aux protéines nommé ".b("efetch").". Après avoir lu " ;
00617     echo
" la documentation correspondante, trouvez la syntaxe associée à la demande du fichier "
.rouge("XML")." complet (".b("&laquo;Genpept&raquo;").") pour la protéine précédente. " ;
00618     echo
" Comment est stockée la séquence en acides aminés de la protéine correspondante&nbsp;? " ;
00619     echo
" Et si on se focalise sur la séquence "
.b("Fasta")." (via le format ".b("&laquo;TinySeq&raquo;")."), que faut-il changer au niveau du script&nbsp;? " ;
00620     
finp() ;
00621     
00622     
p
("texte") ;
00623     echo
bleu
("UNIPROT")." est un un autre centre international dédié à la bioinformatique. Cherchez la protéine précédente dans la base de connaissances des protéines. " ;
00624     echo
"Comment fait-on pour voir le fichier "
.rouge("XML")." correspondant&nbsp;? " ;
00625     echo
" Comment est stockée la séquence en acides aminés de la protéine correspondante&nbsp;? " ;
00626     echo
" A quoi correspond le format "
.b("RDF")." proposé en haut et à droite du format ".rouge("XML")." dans la page Web de visualisation de la protéine&nbsp;? " ;
00627     
finp() ;
00628     
00629     
solution
($numExo) ;
00630     
00631     
p
("texte") ;
00632     echo
"L'adresse officielle du NCBI est "
.href("http://www.ncbi.nlm.nih.gov/").". " ;
00633     echo
"Il faut choisir la base de données "
.b("&laquo;Protein&raquo;")." parmi celles proposées sur la page d'accueil pour faire l'exercice. " ;
00634     
finp() ;
00635     
00636     
p
("texte") ;
00637     echo
" Il est aussi possible d'utiliser directement l'adresse "
.href("http://www.ncbi.nlm.nih.gov/protein/")." pour restreindre la recherche aux protéines dans cette base de données. " ;
00638     echo
" L'utilisation du panneau d'interrogation avec les deux références " ;
00639     echo
b
("AAA18335")." et ".b("424143")." fournit deux URL différentes, " ;
00640     echo
href
("http://www.ncbi.nlm.nih.gov/protein/AAA18335"). " et " ;
00641     echo
href
("http://www.ncbi.nlm.nih.gov/protein/424143")." mais qui contiennent exactement les m&ecirc;mes informations car elles correspondent à la m&ecirc;me protéine " ;
00642     echo
b
("HSP 27 [Mus musculus]").". " ;
00643     
finp() ;
00644     
00645     
p
("texte") ;
00646     echo
"Si on cherche "
.b("ncbi efetch")." avec Google, on obtient la page d'aide à l'adresse " ;
00647     
#echo href("http://ww.ncbi.nlm.nih.gov/entrez/query/static/efetchseq_help.html").". " ;
00648     
echo
href("http://www.ncbi.nlm.nih.gov/books/NBK25499/#chapter4.EFetch").". " ;
00649     echo
"Une lecture attentive de la page ciblée sur l'expression "
.b("db=protein")." permet de voir qu'il y a deux appels possibles du script cgi, " ;
00650     echo
" l'un nommé gp qui correspond au format complet Genpept et l'autre nommé fasta, qui correspond à TinySeq. " ;
00651     echo
"Les URL correspondantes sont&nbsp;: " ;
00652     echo
href
("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=protein&amp;id=424143&amp;rettype=gp&amp;retmode=xml") ;
00653     echo
" et " ;
00654     echo
href
("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=protein&amp;id=424143&amp;rettype=fasta&amp;retmode=xml").". " ;
00655     echo
"On note bien évidemment que l'URL se termine par "
.b("retmode=xml")." de façon à obtenir un fichier $XML." ;
00656     echo
" La première URL renvoie un fichier "
.b("sequence.gbx.xml")." de DTD ".bleu("GBSet") ;
00657     echo
" dont le contenu est consultable "
.href("Ncbi/AAA18335.sequence.gbx.xml","ici") ;
00658     echo
" alors que la seconde renvoie un fichier "
.b("sequence.fasta.xml")." de DTD ".bleu("TSeqSet") ;
00659     echo
" dont le contenu est consultable "
.href("Ncbi/AAA18335.sequence.fasta.xml","là").". " ;
00660     
finp() ;
00661     
00662     
p
("texte") ;
00663     echo
"Pour Uniprot, dont le site officiel est "
.href("http://www.uniprot.org/").", une recherche dans la PK (Protein KnowledgeBase) nommée UniProtKB " ;
00664     echo
" ne donne aucune réponse satisfaisante pour 424143 " ;
00665     echo
" (soit l'URL "
.href("http://www.uniprot.org/uniprot/?query=424143")."). " ;
00666     echo
" Par contre, avec AAA18335 nous pouvons retrouver la protéine " ;
00667     echo
b
("HSP 27 [Mus musculus]")."&nbsp;: " ;
00668     echo
href
("http://www.uniprot.org/uniprot/?query=AAA18335").". " ;
00669     echo
" Son numéro de référence pour Uniprot est P14602, ce qui permet de construire l'URL de la page de visualisation " ;
00670     echo
href
("http://www.uniprot.org/uniprot/P14602").", " ;
00671     echo
" celle de son fichier
$XML " ;
00672     echo
href
("http://www.uniprot.org/uniprot/P14602.xml") ;
00673     echo
", celle de son fichier RDF&nbsp;: " ;
00674     echo
href
("http://www.uniprot.org/uniprot/P14602.rdf") ;
00675     echo
" et m&ecirc;me celle de son fichier FASTA si on en a besoin&nbsp;: " ;
00676     echo
href
("http://www.uniprot.org/uniprot/P14602.fasta") ;
00677     echo
". " ;
00678     
finp() ;
00679     
00680     
p
("texte") ;
00681     echo
"Voici les structures utilisées pour stocker les séquences "
.b("Fasta")." (des retours-charriot ont été ajoutés pour la lisibilité)&nbsp;: " ;
00682     
finp() ;
00683     
00684     
pre_fichier
("AAA18335.txt","cadre") ;
00685     
00686     
p
("texte") ;
00687     echo
"On peut remarquer que les suites d'acides aminés sont toujours stockées comme le contenu texte d'un élément, jamais comme un attribut. " ;
00688     echo
" Pour Uniprot, des outils de vérification comme la longueur de la séquence et sa \"checksum\" sont fournies comme attribut. " ;
00689     
finp() ;
00690     
00691     
p
("texte") ;
00692     echo
"Le fichier RDF associé à la protéine, soit " ;
00693     echo
href
("http://www.uniprot.org/uniprot/P14602.rdf") ;
00694     echo
" permet d'appliquer les concepts du "
.href("http://fr.wikipedia.org/wiki/Web_s%C3%A9mantique","web sémantique")." aux données d'Uniprot." ;
00695     
finp() ;
00696     
00697     
finsolution() ;
00698     
00699     
finblockquote() ;
00700     
00701     
## -------------------------------------------------------------------------------------------
00702     
00703     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Bases de données et XML ; espaces de noms
00704     
00705     ## -------------------------------------------------------------------------------------------
00706     
00707     
00708     
blockquote() ;
00709     
00710     
p
("texte") ;
00711     echo
"Peut-on facilement exporter une base de données "
.vert("MySQL")." en ".rouge("XML")."&nbsp;? " ;
00712     
finp() ;
00713     
00714     
p
("texte") ;
00715     echo
"Application&nbsp;: exporter la base "
.b("GESTION")." qui contient les 4 tables ".b("FOUR, CLI, ART")." et ".b("CMD")." de notre ".href("../tuteurs/tutmysql.htm","tuteur MySql").". " ;
00716     echo
" Un script qui permet de recréer les tables et leur contenu est "
.href("BD_gestion_mysql.txt","BD_gestion_mysql").". " ;
00717     
finp() ;
00718     
00719     
p
("texte") ;
00720     echo
"On peut imaginer qu'une mauvaise conception d'une base de données ait abouti " ;
00721     echo
" à un champ "
.b("NOM")." pour le nom d'un fournisseur, ";
00722     echo
" à un champ "
.b("NOM")." pour le nom d'un client " ;
00723     echo
" et à un champ "
.b("NOM")." pour le nom d'un article. " ;
00724     echo
" Si on veut que ces trois noms soient désignés de façon différente, trouver une solution avec des attributs " ;
00725     echo
" qui conserve la désignation "
.b("&lt;NOM&gt;")." puis montrer comment les notions de " ;
00726     echo
href
("http://en.wikipedia.org/wiki/Namespace","namespace")." et de ".href("http://en.wikipedia.org/wiki/XML_namespace","XML namespace") ;
00727     echo
" permettent de " ;
00728     echo
" &laquo;bien&raquo; gérer cette mauvaise conception." ;
00729     echo
" On pourra, pour tester la solution, utilisera comme point de départ le fichier de test "
.href("noms.xml")."." ;
00730     
finp() ;
00731     
00732     
solution
($numExo) ;
00733     
00734     
p
("texte") ;
00735     echo
"Si on lit l'aide de la commande "
.b("mysql_dump").", dont une copie est ".href("mysql_dump.txt","ici").", on peut voir qu'il existe une option de sortie nommé ".b("--xml").". " ;
00736     echo
" Ainsi, la commande "
.b("sqldump --xml --database gestion > BD_gestion_mysql.xml")." produit le fichier " ;
00737     echo
href
("BD_gestion_mysql.xml").". On remarquera que chaque table donne lieu à deux éléments nommés respectivement " ;
00738     echo
s_span
("table_structure","gbleu")." et ".s_span("table_data","gbleu").", eux-m&ecirc;mes inclus dans un élément " ;
00739     echo
s_span
("database","gbleu").", ce qui montre qu'on pourrait \"dumper\" plusieurs bases de données d'un coup. " ;
00740     
finp() ;
00741     
00742     
p
("texte") ;
00743     echo
" La structuration utilisée pour les tables, qui peut s'apliquer à n'importe quelle table puisqu'elle nomme les éléments " ;
00744     echo
"ligne ("
.s_span("row","gbleu").") et champ (".s_span("field","gbleu")."), n'est sans doute pas la plus adaptée à un traitement efficace des données. " ;
00745     echo
"Par exemple, au lieu de " ;
00746     
finp() ;
00747     
00748     
pre_fichier
("rowgestion1.txt","cadre") ;
00749     
00750     
p
("texte") ;
00751     echo
" il serait sans doute plus explicite d'utiliser " ;
00752     
finp() ;
00753     
00754     
pre_fichier
("rowgestion2.txt","cadre") ;
00755     
00756     
# namespace wiki français et doc w3c citée. détailler...
00757     
00758     
p
("texte") ;
00759     echo
"Pour utiliser des "
.b("namespaces").", il suffit de définir leurs préfixes au niveau de l'élément racine et d'utiliser ensuite les préfixes là " ;
00760     echo
" où on en a besoin. Le fichier "
.href("nomsAvecNs.xml")." contient une solution avec des préfixes courts et " ;
00761     echo
href
("nomsAvecNsLongs.xml")." contient une solution avec des préfixes longs. Si le gain en lisibilité et en non-ambiguité n'est " ;
00762     echo
" pas si flagrant que cela (après tout, "
.b("&lt;fournisseur&gt;...&lt;f:nom&gt;")." est suffisamment explicite), l'utilité de la notion d'espace de " ;
00763     echo
" de noms se comprend mieux quand, après une transformation, les différents éléments sont intégrés dans un seul et m&ecirc;me fichier. Ainsi " ;
00764     echo
" le fichier "
.href("gestionSansNs.xml")." suivant " ;
00765     
finp() ;
00766     
00767     
pre_fichier
("gestionSansNs.xml","cadre") ;
00768     
00769     
p
("texte") ;
00770     echo
" comporte des ambiguités là où " ;
00771     echo
" le fichier "
.href("gestionAvecNs.xml")." dont le contenu est listé ci-dessous " ;
00772     
finp() ;
00773     
00774     
pre_fichier
("gestionAvecNs.xml","cadre") ;
00775     
00776     
p
("texte") ;
00777     echo
" n'en a aucune." ;
00778     
finp() ;
00779     
00780     
finsolution() ;
00781     
00782     
finblockquote() ;
00783     
00784     
## -------------------------------------------------------------------------------------------
00785     
00786     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Dessins et XML
00787     
00788     ## -------------------------------------------------------------------------------------------
00789     
00790     
00791     
blockquote() ;
00792     
00793     
p
("texte") ;
00794     echo
"On structure un "
.bleu("dessin 2D")." élémentaire selon les règles suivantes. " ;
00795     echo
" Un dessin est un cercle, un rectangle ou un triangle. " ;
00796     echo
" Un cercle est défini par un centre et un rayon, " ;
00797     echo
" un rectangle par son "
.em("csg")." (coin supérieur gauche), une longueur et une largeur, " ;
00798     echo
" un triangle par trois points. " ;
00799     echo
" Chaque élément graphique peut avoir une couleur parmi les mots prédéfinis bleu, rouge, jaune. " ;
00800     echo
" Ecrire un fichier "
.b("dessin.xml")." qui dans un " ;
00801     echo
href
(wikien("Viewport"),"viewport")." bleu de 500 pixels de large et 300 de haut, met un \"soleil\" jaune de rayon 15 pixels en (450,50), " ;
00802     echo
" une plage rectangulaire verte qui fait toute la largeur et qui fait 100 pixels de haut. " ;
00803     echo
" Pour les plus fort(e)s, rajouter une petite étoile de mer rouge en bas à gauche à l'aide de trois triangles bien choisis. " ;
00804     echo
" A défaut, on placera juste un triangle plein et en rouge. " ;
00805     echo
" On pourra s'inspirer du dessin ci-dessous et de la syntaxe "
.href("http://www.w3.org/Graphics/SVG/IG/resources/svgprimer.html#examples","SVG")."." ;
00806     
finp() ;
00807     
00808     
p() ;
00809     
nbsp
(30) ;
00810     echo
href
("dessin2.png",img("dessin2.png","",200)) ;
00811     
finp() ;
00812     
00813     
p
("texte") ;
00814     echo
" Ecrire ensuite la \"vraie\" version en "
.b("SVG")." de ce dessin. " ;
00815     
finp() ;
00816     
00817     
p
("texte") ;
00818     echo
"Lister tous les éléments
$XML distincts utilisés dans le ".href("Svg/firefox-logo.svg","logo du renard")." ci-dessous, puis " ;
00819     echo
" compter tous les éléments avec leurs attributs. " ;
00820     
finp() ;
00821     
00822     
p() ;
00823     
nbsp
(30) ;
00824     echo
href
("Svg/firefox.svg",img("firefox-logo.jpg","",200)) ;
00825     
finp() ;
00826     
00827     
p
("texte") ;
00828      echo
"Expliquer comment on obtient un rendu \"propre et intéressant\" des horaires de " ;
00829      echo
href
("http://www.celcat.fr/","CELCAT")." par exemple pour les " ;
00830      echo
href
("http://celcat.univ-angers.fr/web/publi/etu/g141908.html","horaires")." de ce cours." ;
00831     
finp() ;
00832     
00833     
p() ;
00834     
nbsp
(30) ;
00835     echo
href
("horairesM1.png",img("horairesM1.png","",250)) ;
00836     
finp() ;
00837     
00838     
p
("texte") ;
00839      echo
"Expliquer comment on obtient un affichage dynamique de données hiérarchiques avec " ;
00840      echo
href
("http://krona.sourceforge.net/examples/du.krona.html","Krona").". " ;
00841     
finp() ;
00842     
00843     
p() ;
00844     
nbsp
(30) ;
00845     
$img
= "krona_demo.svg" ;
00846     echo
href
($img,img($img,"",250)) ;
00847     
finp() ;
00848     
pvide() ;
00849     
00850     
solution
($numExo) ;
00851     
00852     
p
("texte") ;
00853     echo
"Voici un fichier
$XML possible pour le dessin avec une syntaxe en français adaptée de SVG, nommé ".href("dessin.xml") ;
00854     
finp() ;
00855     
00856     
pre_fichier
("dessin.xml","cadre") ;
00857     
00858     
p
("texte") ;
00859     echo
"La \"vraie\" version dont un rendu est dans "
.href("Svg/dessin1.svg","dessin1.svg")." est la suivante " ;
00860     
finp() ;
00861     
00862     
pre_fichier
("Svg/dessin1.svg","cadrebleu") ;
00863     
00864     
p
("texte") ;
00865     echo
"Et pour le dessin avec l'étoile "
.href("Svg/dessin2.svg","dessin2.svg")." on peut utiliser " ;
00866     
finp() ;
00867     
00868     
pre_fichier
("Svg/dessin2.svg","cadrejaune") ;
00869     
00870     
blockquote() ;
00871     
table
(1,15,"collapse") ;
00872     
tr() ;
00873     
td
() ; echo "Rendu SVG (si le browser le permet)" ; fintd() ;
00874     
td
() ; echo "<object data='Svg/dessin1.svg' width='500' />\n" ; fintd() ;
00875     
td
() ; echo "<object data='Svg/dessin2.svg' width='500' />\n" ; fintd() ;
00876     
fintr() ;
00877     
tr() ;
00878     
td
() ; echo "Rendu PNG (copie d'écran)" ; fintd() ;
00879     
td
() ; echo img("dessin1.png","dessin1","500") ; fintd() ;
00880     
td
() ; echo img("dessin2.png","dessin2","500") ; fintd() ;
00881     
fintr() ;
00882     
fintable() ;
00883     
finblockquote() ;
00884     
00885     
p
("texte") ;
00886     echo
"Il y a en fait assez peu d'éléments utilisés pour le renard. Ainsi la commande " ;
00887     echo
b
("xmlstarlet el -u firefox.svg")." renvoie une liste de 26 éléments distincts dans l'arbre, pour 348 éléments en tout. " ;
00888     echo
"Si on retire les éléments égaux emboités comme g et g/g, il ne reste que 17 \"vrais\" éléments utilisés&nbsp;:" ;
00889     
finp() ;
00890     
00891     
# manip pour produire firefox.elts :
00892     # xmlstarlet el -u > firefox.1
00893     # ménage à la main (sedit) pour produire firefox.2
00894     # numerote firefox.1 entete=1 > a
00895     # numerote firefox.2 entete=1 > b
00896     # fusionne a b 65 et voilà !
00897     
00898     
pre_fichier
("firefox.elts","cadre") ;
00899     
00900     
p
("texte") ;
00901     echo
"Pour connaitre les attributs utilisés et pour compter chacun des éléments, il faut programmer le comptage des balises d'ouverture et de fermeture, " ;
00902     echo
" ce que fait notre programme "
.href("montresource.php?nomfic=eltatt_inc.php","eltattres.php")." dont l'interface de départ est ".href("../internet/eltatt.php","ici")."." ;
00903     echo
" On pourra cliquer sur le lien "
.href("../internet/eltattres.php?url=http://forge.info.univ-angers.fr/~gh/Webrd/Svg/firefox-logo.svg&amp;envoi=envoi","elementsRenard") ;
00904     echo
" pour le vérifier et lire les comptages." ;
00905     
finp() ;
00906     
00907     
p
("texte") ;
00908     echo
"L'affichage fourni par "
.b("CELCAT")." est un simple " ;
00909     echo
href
("http://fr.openclassrooms.com/informatique/cours/structurez-vos-donnees-avec-xml/mettez-en-forme-vos-documents-xml-avec-css","rendu de $XML avec CSS").". " ;
00910     
finp() ;
00911     
00912     
p
("texte") ;
00913     echo
"Pour " ;
00914     echo
href
("http://sourceforge.net/p/krona/home/krona/","krona").", " ;
00915     echo
" c'est un peu plus compliqué. " ;
00916     echo
" Il y a du code Javascript " ;
00917     echo
href
("https://searchcode.com/codesearch/view/25755216/","krona.js") ;
00918     echo
" qui lit la partie
$XML de la page HTML et qui produit le graphique interactif " ;
00919     echo
" dans un élément "
.href("http://www.alsacreations.com/tuto/lire/1484-introduction.html","canvas").". " ;
00920     echo
" L'export, lui, est un \"snapshot\" généré pour "
.b("SVG").". " ;
00921     
finp() ;
00922     
00923     
finsolution() ;
00924     
00925     
finblockquote() ;
00926     
00927     
## -------------------------------------------------------------------------------------------
00928     
00929     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # XML et le logiciel R
00930     
00931     ## -------------------------------------------------------------------------------------------
00932     
00933     
blockquote() ;
00934     
00935     
p
("texte") ;
00936     echo
"Parmi les logiciels vus en ligne de commande, lesquel(s) savent lire des fichiers sur internet via une URL&nbsp;? " ;
00937     
finp() ;
00938     
00939     
p
("texte") ;
00940     echo
"Après avoir parcouru l'"
.href("../wstat/Introduction_R/","introduction non élémentaire au logiciel $R").", " ;
00941     echo
" est-ce que le logiciel
$R sait lire des fichiers sur internet via une URL&nbsp;? " ;
00942     echo
" Et des fichiers
$XML&nbsp;? " ;
00943     
finp() ;
00944     
00945     
p
("texte") ;
00946     echo
" Comment faire avec
$R pour récupérer le contenu d'un tableau dans une page Web&nbsp;? " ;
00947     
finp() ;
00948     
00949     
solution
($numExo) ; # ------------------------------------------------------------------------
00950     
00951     
p
("texte") ;
00952     echo
b
("rxp").", " ;
00953     echo
b
("xmllint").", " ;
00954     echo
b
("xmlstarlet")." et " ;
00955     echo
b
("xsltproc")." " ;
00956     echo
" savent tous lire des fichiers sur internet via une URL. " ;
00957     
finp() ;
00958     
00959     
p
("texte") ;
00960     echo
"La lecture des fichiers via une URL est une simple formalité en
$R car elle est native." ;
00961     
finp() ;
00962     
00963     
p
("texte") ;
00964     echo
"A l'aide du package nommé "
.s_span("XML","gbleuf").", la lecture de fichiers $XML de pages Web est très facile. " ;
00965     echo
" Consulter la solution de l'"
.href("../wstat/Introduction_R/intror2.php?solutions=1#tdm5","exercice 5")." dans " ;
00966     echo
" l'"
.href("../wstat/Introduction_R/","introduction non élémentaire au logiciel $R")." pour voir cela par l'exemple. " ;
00967     
finp() ;
00968     
00969     
$url
= "http://www.springer.com/us/book/9781461478997" ;
00970     
p
("texte") ;
00971     echo
" Pour vraiment plus de détails, on pourra lire les 650 pages de l'excellent ouvrage " ;
00972     echo
" "
.href($url,"XML and Web Technologies for Data Sciences with R") ;
00973     echo
" de D. Nolan et D. Temple Lang&nbsp;:" ;
00974     
finp() ;
00975     
00976     
$img
= "lang.jpg" ;
00977     
p
("texte") ;
00978     echo
href
($url,img($img,$img,250)) ;
00979     
finp() ;
00980     
00981     
p
("texte") ;
00982     echo
"Pour une vision précise des rapports entre
$R et les technologies Web, le mieux est sans doute de lire la " ;
00983     echo
"&laquo;"
.href("https://cran.r-project.org/web/views/",em("Task View"))."&raquo;" ;
00984     echo
" nommée " ;
00985     echo
href
("https://cran.r-project.org/web/views/WebTechnologies.html","WebTechnologies.html")." " ;
00986     echo
" et sa petite soeur sur l'"
.href("https://github.com/ropensci/opendata","opendata")." (sur Github)." ;
00987     
finp() ;
00988     
00989     
p
("texte") ;
00990     echo
b
("Remarque&nbsp;:") ;
00991     echo
" il est possible d'apprendre à utiliser
$R (et Python) sans installation logicielle via " ;
00992     echo
href
("https://www.getdatajoy.com/","DataJoy")."." ;
00993     
finp() ;
00994     
00995     
finsolution() ;
00996     
00997     
finblockquote() ;
00998     
00999     
## -------------------------------------------------------------------------------------------
01000     
01001     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Questions diverses
01002     
01003     ## -------------------------------------------------------------------------------------------
01004     
01005     
blockquote() ;
01006     
01007     
p
("texte") ;
01008     echo
"Faut-il indenter les fichiers&nbsp;? " ;
01009     
finp() ;
01010     
01011     
p
("texte") ;
01012     echo
"Quel navigateur Web est le plus adapté à l'affichage de fichiers
$XML&nbsp;? " ;
01013     
finp() ;
01014     
01015     
p
("texte") ;
01016     echo
"Quels éditeurs peut-on utiliser pour
$XML, sous Linux, sous Windows&nbsp;? " ;
01017     
finp() ;
01018     
01019     
p
("texte") ;
01020     echo
"Qu'est-ce qu'une structure mixte&nbsp;? Pourquoi faut-il éviter les structures mixtes&nbsp;? " ;
01021     
finp() ;
01022     
01023     
p
("texte") ;
01024     echo
"Une page Web est-elle un document
$XML&nbsp;? " ;
01025     
finp() ;
01026     
01027     
p
("texte") ;
01028     echo
"Une fichier "
.href("http://xulfr.org/xulplanet/mozsdk/rdfstart.html","RDF")." est-il un document $XML&nbsp;? " ;
01029     echo
" Et une image "
.href("http://fr.wikipedia.org/wiki/Scalable_Vector_Graphics","SVG")."&nbsp;? " ;
01030     
finp() ;
01031     
01032     
p
("texte") ;
01033     echo
"Pourquoi s'intéresser plus à
$XML 1.0 qu'à $XML 1.1&nbsp;? Quelles sont les différences&nbsp;?" ;
01034     
finp() ;
01035     
01036     
p
("texte") ;
01037     echo
"Est-ce que HTML5 est un langage basé sur
$XML&nbsp;? " ;
01038     
finp() ;
01039     
01040     
solution
($numExo) ; # ------------------------------------------------------------------------
01041     
01042     
p
("texte") ;
01043     echo
"Il n'est pas conseillé d'indenter, dans la mesure où les espaces et les retours-charriots, les tabulations... " ;
01044     echo
" désignés par l'appellation "
.b("white spaces")." sont souvent mal gérés ou gérés différemment suivant " ;
01045     echo
" les logiciels, et en particulier les navigateurs, certains créant des noeuds-texte pour contenir ces espaces et assimilés. " ;
01046     echo
" On pourra s'en convaincre en ouvrant avec divers navigateurs les deux fichiers " ;
01047     echo
href
("whitespace1.xml","whitespace1")." et ".href("whitespace2.xml","whitespace2")." qui ne différent que par des espaces et des retours-charriots. " ;
01048     echo
" Si on indente, par contre, il faut toujours indenter de la m&ecirc;me façon." ;
01049     echo
" Normaliser les espaces, les tabulations, les retours à la ligne, voire stocker les attributs par ordre alphabétique " ;
01050     echo
" revient à utiliser une "
.href("http://en.wikipedia.org/wiki/Canonical_XML","forme canonique")." pour les fichiers $XML." ;
01051     
finp() ;
01052     
01053     
01054     
p
("texte") ;
01055     echo
"Un fichier de "
.href("http://fr.wikipedia.org/wiki/Resource_Description_Framework","description de ressources")." RDF n'est pas forcément un " ;
01056     echo
" un fichier
$XML, car RDF et le " ;
01057     echo
href
("http://fr.wikipedia.org/wiki/Web_s%C3%A9mantique","web sémantique")." utilisent de nombreux formats, parfois " ;
01058     echo
"
$XML et parfois non $XML comme les formats ".href("http://fr.wikipedia.org/wiki/Turtle_%28syntaxe%29","turtle")." et " ;
01059     echo
href
("http://fr.wikipedia.org/wiki/Notation3","Notation3").". " ;
01060     echo
" On écrit RDF/XML lorsqu'on veut indiquer que les ressources sont écrites en format
$XML. " ;
01061     echo
" Une image SVG est aussi un fichier
$XML mais qui est interprété dès son ouverture pour fournir un rendu graphique. " ;
01062     echo
" Ainsi, ouvrir "
.href("exemple.rdf")." et ".href("exemple.svg")." avec un navigateur ne produit pas les m&ecirc;mes effets&nbsp;: " ;
01063     echo
" le fichier RDF est affiché comme un fichier
$XML classique, le fichier SVG est dessiné à l'écran. " ;
01064     
finp() ;
01065     
01066     
p
("texte") ;
01067     echo
"Les notions vues et les explications fournies en cours " ;
01068     echo
"(volontairement non reproduites ici) " ;
01069     echo
" permettent de répondre aux questions liées à
$XML 1.1 et HTML5." ;
01070     
finp() ;
01071     
01072     
/*
01073     http://blog.adriaandejonge.eu/2008/08/differences-between-xml-10-and-11.html
01074     http://xmlfr.org/actualites/tech/080207-0001
01075     http://xmlfr.org/actualites/decid/021022-0001
01076     http://xmlfr.org/actualites/decid/040210-0002
01077     http://www.rapidprogramming.com/questions-answers/What-is-the-difference-between-XML-1-1-and-XML-1-0--471
01078     */
01079     
01080     
finsolution() ;
01081     
01082     
finblockquote() ;
01083     
01084     
01085     
## -------------------------------------------------------------------------------------------
01086     
01087     
finPageExercices
(1) ; # contient finSection() et finPage() ; la fonction est dans webrd_inc.php
01088     
01089     
?>

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)