Valid XHTML     Valid CSS2    

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 
;
00028     
00029     if (!isset($_GET
["standalone"])) { debutPage("XML en L2, TP $numSerie","strict","","l2xml.js") ; } ;
00030     
00031     debutSection
() ;
00032     h1
("$XML en L2, universit&eacute; d'Angers ") ;
00033     h2
(s_nbsp(4).href("../../","gilles.hunault@univ-angers.fr","gvert nou")) ;
00034     pvide
() ;
00035     h2
(s_span("T.P. num&eacute;ro $numSerie","gbleu")."&nbsp;:&nbsp;structuration") ;
00036     pvide
() ;
00037     
00038     ###########################################################################################
00039     
00040     $tableauDesRubriques 
= array() ;
00041     $idr 
;
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   
;
00055     $numSerie 
;
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é&nbsp;? 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é&nbsp;? Si on nomme "
.s_span("numService","grouge")." cette donnée, comment l'implémenter&nbsp;? " ;
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&nbsp;? " 
;
00090     finp
() ;
00091     
00092     solution
($numExo,$numSerie) ;
00093     
00094     p
() ;
00095     echo "Voici les fichiers solutions&nbsp;: " 
;
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 &laquo;à la main&raquo; 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&nbsp;: il existe deux façons de coder des éléments auto-fermants et il vaut mieux utiliser toujours le m&ecirc;me " ;
00134     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 " 
;
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&ecirc;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&ucirc;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 &laquo;panachée&raquo; 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&nbsp;? " ;
00182     finp
() ;
00183     
00184     p
("texte") ;
00185     echo "Y a-t-il une structuration meilleure qu'une autre pour cet exemple&nbsp;? " 
;
00186     finp
() ;
00187     
00188     p
("texte") ;
00189     echo "Qu'est-ce que "
.b("XCARD")."&nbsp;? Quel rapport avec ".b("VCARD")." et ".b("XML")."&nbsp;? " ;
00190     echo " Que sont  "
.ghRouge("RFC-6350")." et ".ghRouge("RFC-63511")."&nbsp;? " ;
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&ecirc;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"),"&laquo;appel à commentaires&raquo;")." 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&nbsp;: " 
;
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&nbsp;? " ;
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&nbsp;? Sous quelle forme, élément ou attribut&nbsp;? " 
;
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 &laquo;panachée&raquo; ("
.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&nbsp;?" ;
00298     echo " Et le navigateur&nbsp;?" 
;
00299     echo " Comment le vérifier&nbsp;?" 
;
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&nbsp;:" ;
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&nbsp;:" ;
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&nbsp;--help&nbsp;|&nbsp;grep&nbsp;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&nbsp;el&nbsp;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&nbsp;:" ;
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&nbsp;:" ;
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")."&nbsp;? " ;
00366     finp
() ;
00367     
00368     p
("texte") ;
00369     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").". " ;
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("&lt;NOM&gt;")." 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 " &laquo;bien&raquo; 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&ecirc;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é&nbsp;:" 
;
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("&lt;fournisseur&gt;...&lt;f:nom&gt;")." 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&ecirc;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&nbsp;? " 
;
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("&laquo;Genpept&raquo;").") 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&nbsp;? " 
;
00470     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;? " ;
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&nbsp;? " ;
00476     echo " Comment est stockée la séquence en acides aminés de la protéine correspondante&nbsp;? " 
;
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&nbsp;? " ;
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("&laquo;Protein&raquo;")." 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&ecirc;mes informations car elles correspondent à la m&ecirc;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&nbsp;: " 
;
00511     echo href
("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=protein&amp;id=424143&amp;rettype=gp&amp;retmode=xml") ;
00512     echo " et " 
;
00513     echo href
("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=protein&amp;id=424143&amp;rettype=fasta&amp;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]")."&nbsp;: " ;
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&nbsp;: " 
;
00533     echo href
("http://www.uniprot.org/uniprot/P14602.rdf") ;
00534     echo " et m&ecirc;me celle de son fichier FASTA si on en a besoin&nbsp;: " 
;
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é)&nbsp;: " ;
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 gH    Retour à la page principale de   (gH)