Listing du fichier l2xml_6_tp2.php
00001 <?php
00002 # # (gH) -_- l2xml_6_tp2.php ; TimeStamp (unix) : 18 Octobre 2017 vers 13:10
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 $XSL = s_span("XSL" ,"grouge") ;
00010 $XPATH = s_span("XPATH","grouge") ;
00011 $DTD = s_span("DTD" ,"grouge") ;
00012 $XSD = s_span("XSD" ,"grouge") ;
00013 $CSS = s_span("CSS" ,"grouge") ;
00014 $CSV = s_span("CSV" ,"grouge") ;
00015 $Excel = s_span("Excel" ,"grouge") ;
00016 $JavaScript = s_span("JavaScript" ,"grouge") ;
00017 $R = s_span("R" ,"grouge") ;
00018 $PHP = s_span("PHP" ,"grouge") ;
00019 $VCARD = ghRouge("VCARD") ;
00020 $XCARD = ghRouge("XCARD") ;
00021 $Fasta = ghRouge("Fasta") ;
00022 $XSL = ghRouge("XSL") ;
00023 $HTML = ghBleu("HTML") ;
00024 $HTML5 = ghBleu("HTML5") ;
00025 $XHTML = ghBleu("XHTML") ;
00026
00027 $numSerie = 2 ;
00028
00029 if (!isset($_GET["standalone"])) { debutPage("XML en L2, TP $numSerie","strict","","l2xml.js") ; } ;
00030
00031 debutSection() ;
00032 h1("$XML en L2, université d'Angers ") ;
00033 h2(s_nbsp(4).href("../../","gilles.hunault@univ-angers.fr","gvert nou")) ;
00034 pvide() ;
00035 h2(s_span("T.P. numéro $numSerie","gbleu")." : structuration") ;
00036 pvide() ;
00037
00038 ###########################################################################################
00039
00040 $tableauDesRubriques = array() ;
00041 $idr = 0 ;
00042 $idr++; $tableauDesRubriques[$idr] = "Structuration de services" ;
00043 $idr++; $tableauDesRubriques[$idr] = "Structuration de personnes, $VCARD et $XCARD" ;
00044 $idr++; $tableauDesRubriques[$idr] = "Structuration de séquences $Fasta" ;
00045 $idr++; $tableauDesRubriques[$idr] = "Structuration de personnes et de services et entités" ;
00046 $idr++; $tableauDesRubriques[$idr] = "Bases de données et $XML ; espaces de noms" ;
00047 $idr++; $tableauDesRubriques[$idr] = "Formats $XML usuels en bioinformatique" ;
00048 $tdmCRLM = new tdm($tableauDesRubriques) ;
00049 $tdmCRLM->titre() ;
00050 $tdmCRLM->menu("oui","oui","nou") ;
00051
00052 pvide() ;
00053
00054 $numExo = 0 ;
00055 $numSerie = 2 ;
00056 direAfficherSolutions($numSerie) ;
00057
00058 ## -------------------------------------------------------------------------------------------
00059
00060 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Structuration de services
00061
00062 ## -------------------------------------------------------------------------------------------
00063
00064 blockquote() ;
00065
00066 p("texte") ;
00067 echo "On veut modéliser des services dans une entreprise comme " ;
00068 echo em("Achats").", " ;
00069 echo em("Direction").", " ;
00070 echo em("Courrier")."..." ;
00071 echo " Ecrire le fichier ".b("serv00.xml")." défini à l'aide des seuls éléments ".s_span("services","gbleu")." et ".s_span("service","gbleu")." ; " ;
00072 echo " les noms de services seront intégrés comme des contenus-texte d'éléments. Comment vérifier que " ;
00073 echo " le fichier est bien formé ? Ajouter le service ".em("Représentation")." après avoir remarqué qu'il " ;
00074 echo " y a un caractère accentué. On nommera ".b("serv01.xml")." le fichier avec accent. " ;
00075 finp() ;
00076
00077 p("texte") ;
00078 echo " Ecrire le fichier ".b("serv02.xml")." défini à l'aide des éléments ".s_span("services","gbleu")." et ".s_span("service","gbleu")." " ;
00079 echo " et du sous-élément ".s_span("nomDeService","gbleu")." dont le contenu-texte est un nom de service " ;
00080 echo " puis écrire le fichier ".b("serv03.xml")." défini à l'aide des éléments ".s_span("services","gbleu")." et ".s_span("service","gbleu")." " ;
00081 echo " et de l'attribut ".s_span("nomDeService","gvert")."." ;
00082 finp() ;
00083
00084 p("texte") ;
00085 echo "On décide maintenant d'ajouter un identifiant de service (comme pour une base de données). Faut-il utiliser " ;
00086 echo " l'initiale des services ou un entier auto-incrémenté ? Si on nomme ".s_span("numService","grouge")." cette donnée, comment l'implémenter ? " ;
00087 echo " Vous écrirez dans ".b("serv04.xml")." à partir de ".b("serv02.xml")." la solution avec sous-élément et " ;
00088 echo " dans ".b("serv05.xml")." la solution avec attribut. " ;
00089 echo " Y a-t-il pour l'instant une meilleure solution ? " ;
00090 finp() ;
00091
00092 solution($numExo,$numSerie) ;
00093
00094 p() ;
00095 echo "Voici les fichiers solutions : " ;
00096 finp() ;
00097
00098 $tabExpl = Array() ;
00099 $tabExpl[0] = "fichier sans accent et sans sous structure" ;
00100 $tabExpl[1] = "fichier avec accent et sans sous structure" ;
00101 $tabExpl[2] = "fichier avec sous-structure en élément" ;
00102 $tabExpl[3] = "fichier avec sous-structure en attribut" ;
00103 $tabExpl[4] = "complément de serv02.xml avec numéro de service en élément" ;
00104 $tabExpl[5] = "complément de serv02.xml avec numéro de service en attribut" ;
00105
00106 blockquote() ;
00107 table(1,7,"collapse") ;
00108 tr() ;
00109 th() ; echo "Fichier" ; finth() ;
00110 th() ; echo "Explications" ; finth() ;
00111 fintr() ;
00112 for ($ndf=0;$ndf<=5;$ndf++) {
00113 tr() ;
00114 td() ; echo href("serv0$ndf.xml") ; fintd() ;
00115 td() ; echo $tabExpl[$ndf] ; fintd() ;
00116 fintr() ;
00117 } ; # fin pour
00118 fintable() ;
00119 finblockquote() ;
00120
00121 montreFichiers(0,5,"serv","visu1") ;
00122
00123 p() ;
00124 echo b("Quelques remarques") ;
00125 finp() ;
00126
00127 p("texte") ;
00128 echo "Il est conseillé, lorsqu'on écrit un fichier $XML «à la main» sous éditeur, d'adopter un standard d'écriture. " ;
00129 echo " Ainsi, dans ".href("serv00.xml")." et ".href("serv02.xml").", il est maladroit de mettre des retours-charriot uniquement pour le service ".b("Courrier").". " ;
00130 finp() ;
00131
00132 p("texte") ;
00133 echo "L'écriture de ".href("serv03.xml")." est encore plus maladroite : il existe deux façons de coder des éléments auto-fermants et il vaut mieux utiliser toujours le même " ;
00134 echo " même codage à l'intérieur d'un même fichier. De plus il doit en principe y avoir un espace devant le symbole / si on utilise le codage court, ce qui " ;
00135 echo " n'est pas le cas pour le service ".b("Direction")." où le / est collé au symbole guillemet du nom de l'attribut. " ;
00136 finp() ;
00137
00138 p("texte") ;
00139 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 " ;
00140 echo " une faute de frappe, non détectable sans typage des numéros de service, d'où l'utilité des grammaires. " ;
00141 echo " Par contre, le choix d'un numéro ou d'une lettre est ici peu important, même si une initiale risque d'apparaitre plusieurs fois, ce qui ne permettra pas d'en faire un " ;
00142 echo " index. On verra plus tard comment définir par grammaire des identifiants et des références à des identifiants. " ;
00143 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") ;
00144 echo " sera, elle aussi, prise en compte par les grammaires. " ;
00145 finp() ;
00146
00147 p("texte") ;
00148 echo "Pour vérifier que les fichiers $XML sont bien formés, on peut bien sûr utiliser rxp, xmllint, xmlstarlet ou se contenter de cliquer sur les liens fournis " ;
00149 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. " ;
00150 finp() ;
00151
00152 finsolution() ;
00153
00154 finblockquote() ;
00155
00156 ## -------------------------------------------------------------------------------------------
00157
00158 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Structuration de personnes
00159
00160 ## -------------------------------------------------------------------------------------------
00161
00162 blockquote() ;
00163
00164 p("texte") ;
00165 echo "On admettra qu'on peut définir sommairement une personne par " ;
00166 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 " ;
00167 echo " à une année de naissance. Ecrire, à partir des éléments ".s_span("personnes","gbleu")." et ".s_span("personne","gbleu")." dans le fichier " ;
00168 echo b("pers01.xml") ;
00169 echo " une solution ".s_span("tout élément","gbleu")." puis dans " ;
00170 echo b("pers02.xml") ;
00171 echo " une solution ".s_span("tout attribut","gbleu").". Enfin, écrire dans " ;
00172 echo b("pers03.xml") ;
00173 echo " une solution «panachée» où ".eltb("nom")." et ".eltb("prénom")." sont des éléments et où ".attv("ddn")." est un attribut. " ;
00174 finp() ;
00175
00176 p("texte") ;
00177 echo "On insérera les personnes Isabelle DUPUIS, née en 1965, Jean DUPONT, né en 1963, Jack DUPONT, né en 1968. " ;
00178 finp() ;
00179
00180 p("texte") ;
00181 echo "Peut-on avoir à la fois un ".eltb("élément")." ddn et un ".attv("attribut")." ddn ? " ;
00182 finp() ;
00183
00184 p("texte") ;
00185 echo "Y a-t-il une structuration meilleure qu'une autre pour cet exemple ? " ;
00186 finp() ;
00187
00188 p("texte") ;
00189 echo "Qu'est-ce que ".b("XCARD")." ? Quel rapport avec ".b("VCARD")." et ".b("XML")." ? " ;
00190 echo " Que sont ".ghRouge("RFC-6350")." et ".ghRouge("RFC-63511")." ? " ;
00191 finp() ;
00192
00193 solution($numExo,$numSerie) ;
00194
00195 p() ;
00196 echo "Voici les fichiers demandés ; le quatrième fichier comporte un élément et un attribut de même nom, ce qui n'est pas recommandé." ;
00197 finp() ;
00198
00199 montreFichiers(1,4,"pers","visu2") ;
00200
00201 p("texte") ;
00202 echo "Pour cet exemple, il n'y a probablement pas de meilleure solution. On peut juste remarquer que la solution avec des " ;
00203 echo " attributs seulement est plus concise et sans doute plus facile à lire. " ;
00204 finp() ;
00205
00206 p("texte") ;
00207 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 " ;
00208 echo " complet que notre simple exemple avec nom, prénom et ddn. Une présentation courte en est fournie sur le wiki français " ;
00209 echo " à l'adresse ".href(wikifr("VCard"))." mais la version anglaise " ;
00210 echo href(wikien("VCard"))." est plus détaillée. On y apprend que " ;
00211 echo href("http://tools.ietf.org/html/rfc6350","RFC6350")." décrit ce que contient une VCARD et que " ;
00212 echo href("http://tools.ietf.org/html/rfc6351","XCARD")." est la version $XML de VCARD. " ;
00213 echo b("RFC6351")." est un ".href(wikifr("Request_for_comments"),"«appel à commentaires»")." qui décrit ce format XCARD. " ;
00214 finp() ;
00215
00216 p("texte") ;
00217 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 " ;
00218 echo " nommé ".ghBleu("vcards")." (noter le ".s_span("s","gvert")." à la fin) et chaque carte de visite correspond à un élément ".ghBleu("vcard")." (donc sans ".s_span("s","gvert")." en fin)." ;
00219 echo " On pourra remarquer que le nom, le surnom, etc. sont structurés en tant qu'".ghBleu("éléments").", pas en tant qu'".ghBleu("attributs").". " ;
00220 echo " Voici une partie d'un fichier XCARD extrait de la RFC6351 : " ;
00221 finp() ;
00222
00223 pre_fichier("xmpxcard.txt","cadre") ;
00224
00225 p("texte") ;
00226 echo b("RFC63511")." n'existe pas. Il s'agit d'un faute de frappe (volontaire) pour ". b("RFC6351")."." ;
00227 finp() ;
00228
00229 finsolution() ;
00230
00231 finblockquote() ;
00232
00233 ## -------------------------------------------------------------------------------------------
00234
00235 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Structuration de séquences Fasta
00236
00237 ## -------------------------------------------------------------------------------------------
00238
00239 blockquote() ;
00240
00241 p("texte") ;
00242 echo "Une ".href("http://fr.wikipedia.org/wiki/FASTA","séquence Fasta")." traditionnelle se compose d'un identifiant comme " ;
00243 echo href("http://www.ncbi.nlm.nih.gov/protein/159163650","1YYCA") ;
00244 echo " et d'une suite d'".href("http://fr.wikipedia.org/wiki/Acide_amin%C3%A9","acides aminés")." comme ".b("VKGFFAECKLA")." ou de " ;
00245 echo href("http://fr.wikipedia.org/wiki/Nucl%C3%A9otide","nucléotides")." comme ".b("TATAAGCCTGCCAAGC").". " ;
00246 echo " On se restreint pour ce qui suit aux protéines (définies comme des suites d'acides aminés). " ;
00247 echo " Si on nomme ".datar("id")." et ".datar("aa")." les données, " ;
00248 echo " comment structurer dans un fichier ".ghRouge("XML")." ces informations ? " ;
00249 echo " On pourra utiliser le fichier texte ".href("fasta_xmp.txt")." pour constituer un fichier ".ghRouge("XML")." de 3 séquences Fasta. " ;
00250 finp() ;
00251
00252 p() ;
00253 echo "Que peut-on ajouter comme aide à la vérification ? Sous quelle forme, élément ou attribut ? " ;
00254 finp() ;
00255
00256 solution($numExo,$numSerie) ;
00257
00258 p("texte") ;
00259 echo "A l'aide des exercices précédents, on peut raisonnablement implémenter une solution tout élément (".href("fasta01.xml")."), " ;
00260 echo " une solution tout attribut (".href("fasta02.xml")."), " ;
00261 echo " ou une solution «panachée» (".href("fasta03.xml")."). " ;
00262 echo " Ajouter un élément longueur (".href("fasta04.xml").") ou un attribut longueur (".href("fasta05.xml")."), " ;
00263 echo " pourrait constituter une vérification utile, quand on connait les longueurs usuelles des séquences Fasta, " ;
00264 echo " ce qui statistiquement n'est pas si simple que cela... " ;
00265 finp() ;
00266
00267 montreFichiers(1,5,"fasta","visu3") ;
00268
00269 finsolution() ;
00270
00271 finblockquote() ;
00272
00273 ## -------------------------------------------------------------------------------------------
00274
00275 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Structuration de personnes et de services et entités
00276
00277 ## -------------------------------------------------------------------------------------------
00278
00279 blockquote() ;
00280
00281 p("texte") ;
00282 echo "Ecrire dans " ;
00283 echo b("agences01.xml") ;
00284 echo " une solution ".eltb("tout élément")." qui intégre un fichier ".ghRouge("XML")." de personnes (auquel on aura ajouté un numéro de service nommé ".datar("numService").")" ;
00285 echo " et un fichier ".ghRouge("XML")." de services puis fournir dans " ;
00286 echo b("agences02.xml") ;
00287 echo " une solution ".attv("tout attribut").". " ;
00288 echo "On pourra utiliser " ;
00289 echo href("pers06.xml")." et ".href("serv06.xml")." pour constituer ".href("agences01.xml") ;
00290 echo " puis " ;
00291 echo href("pers07.xml")." et ".href("serv07.xml")." pour constituer ".href("agences02.xml") ;
00292 echo ". " ;
00293 finp() ;
00294
00295 p("texte") ;
00296 echo " Si on utilise des entités de type caractères dans une $DTD interne, est-ce que les logiciels " ;
00297 echo b("rxp").", ".b("xmllint")." ou ".b("xmlstarlet")." en tiennent compte ?" ;
00298 echo " Et le navigateur ?" ;
00299 echo " Comment le vérifier ?" ;
00300 finp() ;
00301
00302 solution($numExo,$numSerie) ;
00303
00304 p("texte") ;
00305 echo "On peut bien évidemment faire un \"copier/coller\" les fichiers de personnes et de services dans un fichier agence " ;
00306 echo "(".href("agences01.xml").", ".href("agences02.xml")."), mais il est sans doute mieux de les inclure via une ".ghRouge("DTD").", soit les " ;
00307 echo " fichiers ".href("agences03.xml")." et ".href("agences04.xml").". " ;
00308 finp() ;
00309
00310 montreFichiers(1,4,"agences","visu4") ;
00311
00312 p("texte") ;
00313 echo "Il est possible de vérifier que les inclusions sont effectives et valides à l'aide de ".b("rxp")." directement car ".b("rxp") ;
00314 echo " affiche par défaut tout le contenu du document $XML. On peut ainsi voir que les inclusions ont été réalisées :" ;
00315 finp() ;
00316
00317 pre_fichier("agences1.txt","cadre") ;
00318
00319 p("texte") ;
00320 echo b(" Firefox")." ne réalise pas les inclusions si on utilise des entités de type caractères dans une $DTD interne :" ;
00321 echo " si on ouvre ".href("agences03.xml")." avec ".b(" Firefox").", le document semble vide." ;
00322 echo " Idem avec ".b("Chrome")." et ".b("Opera").". " ;
00323 finp() ;
00324
00325 p("texte") ;
00326 echo " Il n'est pas possible de vérifier que les inclusions sont effectives et valides à l'aide de ".b("xmllint")." directement parce que " ;
00327 echo " par défaut ".b("xmllint")." ne réalise pas les inclusions. " ;
00328 echo " A l'aide des commandes ".b("xmllint --help | grep entity")." on voit qu'il faut rajouter le paramètre ".b("--noent") ;
00329 echo " pour que ".b("xmllint")." réalise les inclusions. " ;
00330 finp() ;
00331
00332 p("texte") ;
00333 echo " Il ne semble pas facile de savoir si ".b("xmlstarlet") ;
00334 echo " réalise ou non pas les inclusions des entités de type caractères dans une $DTD interne. " ;
00335 echo " A l'aide des commandes ".b("xmlstarlet el agences03.xml")." on voit que " ;
00336 echo " pour que ".b("xmlstarlet")." ne réalise pas les inclusions en standard. " ;
00337 echo " On aurait aussi pu faire une erreur dans ".href("pers06.xml")." et regarder si les logiciels affichent des erreurs :" ;
00338 finp() ;
00339
00340 pre_fichier("agences2.txt","cadre") ;
00341
00342 p("texte") ;
00343 echo " Une lecture attentive du " ;
00344 echo href("http://xmlstar.sourceforge.net/doc/UG/xmlstarlet-ug.html","manuel")." de ".b("xmlstarlet").", pourtant très détaillé, " ;
00345 echo " ne semble pas fournir la solution. " ;
00346 echo " Toutefois, elle existe cependant, via l'option ".b("c14n")." qui réalise l'inclusion :" ;
00347 finp() ;
00348
00349 pre_fichier("agences3.txt","cadre") ;
00350
00351 finsolution() ;
00352
00353 finblockquote() ;
00354
00355 ## -------------------------------------------------------------------------------------------
00356
00357 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Bases de données et XML ; espaces de noms
00358
00359 ## -------------------------------------------------------------------------------------------
00360
00361
00362 blockquote() ;
00363
00364 p("texte") ;
00365 echo "Peut-on facilement exporter une base de données ".ghVert("MySQL")." en ".ghRouge("XML")." ? " ;
00366 finp() ;
00367
00368 p("texte") ;
00369 echo "Application : 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").". " ;
00370 echo " Un script qui permet de recréer les tables et leur contenu est ".href("BD_gestion_mysql.txt","BD_gestion_mysql").". " ;
00371 finp() ;
00372
00373 p("texte") ;
00374 echo " Pour les plus fort(e)s, on utilisera le ".b("docker")." nommé ".ghVert("_php7")." afin de créer ".href("BD_gestion_mysql.xml")." " ;
00375 echo " à l'aide de ".href("http://localhost/phpmyadmin","","grouge")." ou en ligne de commandes." ;
00376 echo " Pour les autres, on se contentera de rapatrier ".href("BD_gestion_mysql.xml","","nou bleu").". " ;
00377 finp() ;
00378
00379 p("texte") ;
00380 echo "On peut imaginer qu'une mauvaise conception d'une base de données ait abouti " ;
00381 echo " à un champ ".b("NOM")." pour le nom d'un fournisseur, ";
00382 echo " à un champ ".b("NOM")." pour le nom d'un client " ;
00383 echo " et à un champ ".b("NOM")." pour le nom d'un article. " ;
00384 echo " Si on veut que ces trois noms soient désignés de façon différente, trouver une solution avec des attributs " ;
00385 echo " qui conserve la désignation ".b("<NOM>")." puis montrer comment les notions de " ;
00386 echo href("http://en.wikipedia.org/wiki/Namespace","namespace")." et de ".href("http://en.wikipedia.org/wiki/XML_namespace","XML namespace") ;
00387 echo " permettent de " ;
00388 echo " «bien» gérer cette mauvaise conception." ;
00389 echo " On pourra, pour tester la solution, utilisera comme point de départ le fichier de test ".href("noms.xml")."." ;
00390 finp() ;
00391
00392 solution($numExo,$numSerie) ;
00393
00394 p("texte") ;
00395 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").". " ;
00396 echo " Ainsi, la commande ".b("mysqldump --xml --database gestion > BD_gestion_mysql.xml")." produit le fichier " ;
00397 echo href("BD_gestion_mysql.xml").". On remarquera que chaque table donne lieu à deux éléments nommés respectivement " ;
00398 echo s_span("table_structure","gbleu")." et ".s_span("table_data","gbleu").", eux-mêmes inclus dans un élément " ;
00399 echo s_span("database","gbleu").", ce qui montre qu'on pourrait \"dumper\" plusieurs bases de données d'un coup. " ;
00400 finp() ;
00401
00402 p("texte") ;
00403 echo " La structuration utilisée pour les tables, qui peut s'apliquer à n'importe quelle table puisqu'elle nomme les éléments " ;
00404 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. " ;
00405 echo "Par exemple, au lieu de " ;
00406 finp() ;
00407
00408 pre_fichier("rowgestion1.txt","cadre") ;
00409
00410 p("texte") ;
00411 echo " il serait sans doute plus explicite d'utiliser " ;
00412 finp() ;
00413
00414 pre_fichier("rowgestion2.txt","cadre") ;
00415
00416 p("texte") ;
00417 echo " Voici par exemple les deux premières lignes de la table ".b("elf")." de la base ".b("statdata") ;
00418 echo " dans un format légèrement arrangé :" ;
00419 finp() ;
00420
00421 pre_fichier("sql-exports.txt","cadre") ;
00422
00423 # namespace wiki français et doc w3c citée. détailler...
00424
00425 p("texte") ;
00426 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à " ;
00427 echo " où on en a besoin. Le fichier ".href("nomsAvecNs.xml")." contient une solution avec des préfixes courts et " ;
00428 echo href("nomsAvecNsLongs.xml")." contient une solution avec des préfixes longs. Si le gain en lisibilité et en non-ambiguité n'est " ;
00429 echo " pas si flagrant que cela (après tout, ".b("<fournisseur>...<f:nom>")." est suffisamment explicite), l'utilité de la notion d'espace de " ;
00430 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ême fichier. Ainsi " ;
00431 echo " le fichier ".href("gestionSansNs.xml")." suivant " ;
00432 finp() ;
00433
00434 pre_fichier("gestionSansNs.xml","cadre") ;
00435
00436 p("texte") ;
00437 echo " comporte des ambiguités là où " ;
00438 echo " le fichier ".href("gestionAvecNs.xml")." dont le contenu est listé ci-dessous " ;
00439 finp() ;
00440
00441 pre_fichier("gestionAvecNs.xml","cadre") ;
00442
00443 p("texte") ;
00444 echo " n'en a aucune." ;
00445 finp() ;
00446
00447 finsolution() ;
00448
00449 finblockquote() ;
00450
00451 ## -------------------------------------------------------------------------------------------
00452
00453 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Formats XML usuels en bioinformatique
00454
00455 ## -------------------------------------------------------------------------------------------
00456
00457 blockquote() ;
00458
00459
00460 p("texte") ;
00461 echo "Le ".ghBleu("NCBI")." est un institut national américain qui fournit de nombreuses ressources en bioinformatique. " ;
00462 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").". " ;
00463 echo "Comment est affichée la séquence en acides aminés de la protéine correspondante ? " ;
00464 finp() ;
00465
00466 p("texte") ;
00467 echo "Afin d'éviter d'encombrer les serveurs, le ".ghBleu("NCBI")." propose un script pour accéder aux protéines nommé ".b("efetch").". Après avoir lu " ;
00468 echo " la documentation correspondante, trouvez la syntaxe associée à la demande du fichier ".ghRouge("XML")." complet (".b("«Genpept»").") pour la protéine précédente. " ;
00469 echo " Comment est stockée la séquence en acides aminés de la protéine correspondante ? " ;
00470 echo " Et si on se focalise sur la séquence ".b("Fasta")." (via le format ".b("«TinySeq»")."), que faut-il changer au niveau du script ? " ;
00471 finp() ;
00472
00473 p("texte") ;
00474 echo ghBleu("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. " ;
00475 echo "Comment fait-on pour voir le fichier ".ghRouge("XML")." correspondant ? " ;
00476 echo " Comment est stockée la séquence en acides aminés de la protéine correspondante ? " ;
00477 echo " A quoi correspond le format ".b("RDF")." proposé en haut et à droite du format ".ghRouge("XML")." dans la page Web de visualisation de la protéine ? " ;
00478 finp() ;
00479
00480 p("texte") ;
00481 echo " Décrire puis donner la structure du fichier " ;
00482 echo href("P14602.xml") ;
00483 echo " et du fichier " ;
00484 echo href("P14602.rdf").". " ;
00485 finp() ;
00486
00487
00488 solution($numExo,$numSerie) ;
00489
00490 p("texte") ;
00491 echo "L'adresse officielle du NCBI est ".href("http://www.ncbi.nlm.nih.gov/").". " ;
00492 echo "Il faut choisir la base de données ".b("«Protein»")." parmi celles proposées sur la page d'accueil pour faire l'exercice. " ;
00493 finp() ;
00494
00495 p("texte") ;
00496 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. " ;
00497 echo " L'utilisation du panneau d'interrogation avec les deux références " ;
00498 echo b("AAA18335")." et ".b("424143")." fournit deux URL différentes, " ;
00499 echo href("http://www.ncbi.nlm.nih.gov/protein/AAA18335"). " et " ;
00500 echo href("http://www.ncbi.nlm.nih.gov/protein/424143")." mais qui contiennent exactement les mêmes informations car elles correspondent à la même protéine " ;
00501 echo b("HSP 27 [Mus musculus]").". " ;
00502 finp() ;
00503
00504 p("texte") ;
00505 echo "Si on cherche ".b("ncbi efetch")." avec Google, on obtient la page d'aide à l'adresse " ;
00506 #echo href("http://ww.ncbi.nlm.nih.gov/entrez/query/static/efetchseq_help.html").". " ;
00507 echo href("http://www.ncbi.nlm.nih.gov/books/NBK25499/#chapter4.EFetch").". " ;
00508 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, " ;
00509 echo " l'un nommé gp qui correspond au format complet Genpept et l'autre nommé fasta, qui correspond à TinySeq. " ;
00510 echo "Les URL correspondantes sont : " ;
00511 echo href("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=protein&id=424143&rettype=gp&retmode=xml") ;
00512 echo " et " ;
00513 echo href("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=protein&id=424143&rettype=fasta&retmode=xml").". " ;
00514 echo "On note bien évidemment que l'URL se termine par ".b("retmode=xml")." de façon à obtenir un fichier $XML." ;
00515 echo " La première URL renvoie un fichier ".b("sequence.gbx.xml")." de DTD ".ghBleu("GBSet") ;
00516 echo " dont le contenu est consultable ".href("AAA18335.sequence.gbx.xml","ici") ;
00517 echo " alors que la seconde renvoie un fichier ".b("sequence.fasta.xml")." de DTD ".ghBleu("TSeqSet") ;
00518 echo " dont le contenu est consultable ".href("AAA18335.sequence.fasta.xml","là").". " ;
00519 finp() ;
00520
00521 p("texte") ;
00522 echo "Pour Uniprot, dont le site officiel est ".href("http://www.uniprot.org/").", une recherche dans la PK (Protein KnowledgeBase) nommée UniProtKB " ;
00523 echo " ne donne aucune réponse satisfaisante pour 424143 " ;
00524 echo " (soit l'URL ".href("http://www.uniprot.org/uniprot/?query=424143")."). " ;
00525 echo " Par contre, avec AAA18335 nous pouvons retrouver la protéine " ;
00526 echo b("HSP 27 [Mus musculus]")." : " ;
00527 echo href("http://www.uniprot.org/uniprot/?query=AAA18335").". " ;
00528 echo " Son numéro de référence pour Uniprot est P14602, ce qui permet de construire l'URL de la page de visualisation " ;
00529 echo href("http://www.uniprot.org/uniprot/P14602").", " ;
00530 echo " celle de son fichier $XML " ;
00531 echo href("http://www.uniprot.org/uniprot/P14602.xml") ;
00532 echo ", celle de son fichier RDF : " ;
00533 echo href("http://www.uniprot.org/uniprot/P14602.rdf") ;
00534 echo " et même celle de son fichier FASTA si on en a besoin : " ;
00535 echo href("http://www.uniprot.org/uniprot/P14602.fasta") ;
00536 echo ". " ;
00537 finp() ;
00538
00539 p("texte") ;
00540 echo "Voici les structures utilisées pour stocker les séquences ".b("Fasta")." (des retours-charriot ont été ajoutés pour la lisibilité) : " ;
00541 finp() ;
00542
00543 pre_fichier("AAA18335.txt","cadre") ;
00544
00545 p("texte") ;
00546 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. " ;
00547 echo " Pour Uniprot, des outils de vérification comme la longueur de la séquence et sa \"checksum\" sont fournies comme attribut. " ;
00548 finp() ;
00549
00550 p("texte") ;
00551 echo "Le fichier RDF associé à la protéine, soit " ;
00552 echo href("http://www.uniprot.org/uniprot/P14602.rdf") ;
00553 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." ;
00554 finp() ;
00555
00556
00557 p("texte") ;
00558 echo " Le fichier " ;
00559 echo href("P14602.xml") ;
00560 echo " contient 990 lignes, 55 éléments seuls, 107 éléments et attributs. " ;
00561 echo " Sa structure, sous forme hiérarchique d'élements et d'attributs est dans le fichier ".href("P14602-xml-structure.txt") ;
00562 finp() ;
00563
00564 pre_fichier("P14602-xml.txt","cadre") ;
00565
00566
00567 p("texte") ;
00568 echo " Le fichier " ;
00569 echo href("P14602.rdf") ;
00570 echo " contient 1992 lignes, 67 éléments seuls, 133 éléments et attributs. " ;
00571 echo " Sa structure, sous forme hiérarchique d'élements et d'attributs est dans le fichier ".href("P14602-rdf-structure.txt") ;
00572 finp() ;
00573
00574 pre_fichier("P14602-rdf.txt","cadre") ;
00575
00576 finsolution() ;
00577
00578 finblockquote() ;
00579
00580 ###########################################################################################
00581
00582 p() ;
00583 echo href("montresource.php?nomfic=l2xml_6_tp2.php","Code-source php de cette page","orange_stim nou")."." ;
00584 finp() ;
00585
00586 finSection() ;
00587
00588 if (!isset($_GET["standalone"])) { finPage() ; } ;
00589 ?>
Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.
Retour à la page principale de (gH)