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