Valid XHTML     Valid CSS2    

XML en L2, université d'Angers

    gilles.hunault@univ-angers.fr

 

T.P. numéro 2 : structuration

 

Table des matières cliquable

  1. Structuration de services

  2. Structuration de personnes, VCARD et XCARD

  3. Structuration de séquences Fasta

  4. Structuration de personnes et de services et entités

  5. Bases de données et XML ; espaces de noms

  6. Formats XML usuels en bioinformatique

 

Il est possible d'afficher toutes les solutions via  ?solutions=1  et de les masquer via  ?solutions=0 .

1. Structuration de services

On veut modéliser des services dans une entreprise comme Achats, Direction, Courrier... Ecrire le fichier serv00.xml défini à l'aide des seuls éléments services et service ; les noms de services seront intégrés comme des contenus-texte d'éléments. Comment vérifier que le fichier est bien formé ? Ajouter le service Représentation après avoir remarqué qu'il y a un caractère accentué. On nommera serv01.xml le fichier avec accent.

Ecrire le fichier serv02.xml défini à l'aide des éléments services et service et du sous-élément nomDeService dont le contenu-texte est un nom de service puis écrire le fichier serv03.xml défini à l'aide des éléments services et service et de l'attribut nomDeService.

On décide maintenant d'ajouter un identifiant de service (comme pour une base de données). Faut-il utiliser l'initiale des services ou un entier auto-incrémenté ? Si on nomme numService cette donnée, comment l'implémenter ? Vous écrirez dans serv04.xml à partir de serv02.xml la solution avec sous-élément et dans serv05.xml la solution avec attribut. Y a-t-il pour l'instant une meilleure solution ?

Solution :  

Voici les fichiers solutions :

Fichier Explications
serv00.xml fichier sans accent et sans sous structure
serv01.xml fichier avec accent et sans sous structure
serv02.xml fichier avec sous-structure en élément
serv03.xml fichier avec sous-structure en attribut
serv04.xml complément de serv02.xml avec numéro de service en élément
serv05.xml complément de serv02.xml avec numéro de service en attribut

serv00.xml       serv01.xml       serv02.xml       serv03.xml       serv04.xml       serv05.xml       

Quelques remarques

Il est conseillé, lorsqu'on écrit un fichier XML «à la main» sous éditeur, d'adopter un standard d'écriture. Ainsi, dans serv00.xml et serv02.xml, il est maladroit de mettre des retours-charriot uniquement pour le service Courrier.

L'écriture de 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 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 n'est pas le cas pour le service Direction où le / est collé au symbole guillemet du nom de l'attribut.

Pour l'instant, le fichier serv04.xml est correct, mais il est clair qu'avoir utilisé 3r comme numéro de service pour Courrier est sans doute une faute de frappe, non détectable sans typage des numéros de service, d'où l'utilité des grammaires. 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 index. On verra plus tard comment définir par grammaire des identifiants et des références à des identifiants. On remarquera que nous avons volontairement dupliqué le service Direction ce qui constitue une erreur, non détectable à ce niveau ; la cardinalité unique sera, elle aussi, prise en compte par les grammaires.

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 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.

 

2. Structuration de personnes, VCARD et XCARD

On admettra qu'on peut définir sommairement une personne par un nom, un prénom et une ddn (date de naissance) que l'on réduira pour l'instant à une année de naissance. Ecrire, à partir des éléments personnes et personne dans le fichier pers01.xml une solution tout élément puis dans pers02.xml une solution tout attribut. Enfin, écrire dans pers03.xml une solution «panachée» où nom et prénom sont des éléments et où ddn est un attribut.

On insérera les personnes Isabelle DUPUIS, née en 1965, Jean DUPONT, né en 1963, Jack DUPONT, né en 1968.

Peut-on avoir à la fois un élément ddn et un attribut ddn ?

Y a-t-il une structuration meilleure qu'une autre pour cet exemple ?

Qu'est-ce que XCARD ? Quel rapport avec VCARD et XML ? Que sont RFC-6350 et RFC-63511 ?

Solution :  

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é.

pers01.xml       pers02.xml       pers03.xml       pers04.xml       

Pour cet exemple, il n'y a probablement pas de meilleure solution. On peut juste remarquer que la solution avec des attributs seulement est plus concise et sans doute plus facile à lire.

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 complet que notre simple exemple avec nom, prénom et ddn. Une présentation courte en est fournie sur le wiki français à l'adresse http://fr.wikipedia.org/wiki/VCard mais la version anglaise http://en.wikipedia.org/wiki/VCard est plus détaillée. On y apprend que RFC6350 décrit ce que contient une VCARD et que XCARD est la version XML de VCARD. RFC6351 est un «appel à commentaires» qui décrit ce format XCARD.

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 nommé vcards (noter le s à la fin) et chaque carte de visite correspond à un élément vcard (donc sans s en fin). On pourra remarquer que le nom, le surnom, etc. sont structurés en tant qu'éléments, pas en tant qu'attributs. Voici une partie d'un fichier XCARD extrait de la RFC6351 :


        <?xml version="1.0" encoding="UTF-8"?>
     
        <vcards xmlns="urn:ietf:params:xml:ns:vcard-4.0">
     
           <vcard>
               <fn><text>Simon Perreault</text></fn>
               <n>
                 <surname>Perreault</surname>
                 <given>Simon</given>
                 <additional/>
                 <prefix/>
                 <suffix>ing. jr</suffix>
                 <suffix>M.Sc.</suffix>
               </n>
          ...
           </vcard>
     
        </vcards>
     
     

RFC63511 n'existe pas. Il s'agit d'un faute de frappe (volontaire) pour RFC6351.

 

3. Structuration de séquences Fasta

Une séquence Fasta traditionnelle se compose d'un identifiant comme 1YYCA et d'une suite d'acides aminés comme VKGFFAECKLA ou de nucléotides comme TATAAGCCTGCCAAGC. On se restreint pour ce qui suit aux protéines (définies comme des suites d'acides aminés). Si on nomme id et aa les données, comment structurer dans un fichier XML ces informations ? On pourra utiliser le fichier texte fasta_xmp.txt pour constituer un fichier XML de 3 séquences Fasta.

Que peut-on ajouter comme aide à la vérification ? Sous quelle forme, élément ou attribut ?

Solution :  

A l'aide des exercices précédents, on peut raisonnablement implémenter une solution tout élément (fasta01.xml), une solution tout attribut (fasta02.xml), ou une solution «panachée» (fasta03.xml). Ajouter un élément longueur (fasta04.xml) ou un attribut longueur (fasta05.xml), pourrait constituter une vérification utile, quand on connait les longueurs usuelles des séquences Fasta, ce qui statistiquement n'est pas si simple que cela...

fasta01.xml       fasta02.xml       fasta03.xml       fasta04.xml       fasta05.xml       

 

4. Structuration de personnes et de services et entités

Ecrire dans agences01.xml une solution tout élément qui intégre un fichier XML de personnes (auquel on aura ajouté un numéro de service nommé numService) et un fichier XML de services puis fournir dans agences02.xml une solution tout attribut. On pourra utiliser pers06.xml et serv06.xml pour constituer agences01.xml puis pers07.xml et serv07.xml pour constituer agences02.xml.

Si on utilise des entités de type caractères dans une DTD interne, est-ce que les logiciels rxp, xmllint ou xmlstarlet en tiennent compte ? Et le navigateur ? Comment le vérifier ?

Solution :  

On peut bien évidemment faire un "copier/coller" les fichiers de personnes et de services dans un fichier agence (agences01.xml, agences02.xml), mais il est sans doute mieux de les inclure via une DTD, soit les fichiers agences03.xml et agences04.xml.

agences01.xml       agences02.xml       agences03.xml       agences04.xml       

Il est possible de vérifier que les inclusions sont effectives et valides à l'aide de rxp directement car rxp affiche par défaut tout le contenu du document XML. On peut ainsi voir que les inclusions ont été réalisées :


     # rxp agences03.xml
     
     <?xml version="1.0" encoding="ISO-8859-1"?>
     <!-- fichier agences03 construit à partir de serv06 et pers06 -->
     <!DOCTYPE agence [
       <!ENTITY services  SYSTEM "serv06.xml">
       <!ENTITY personnes SYSTEM "pers06.xml">
     ]>
     <agence>
     
     <!-- serv06.xml -->
     <services>
       <service>
          <numService>1</numService>
          <nomDeService>Achats</nomDeService>
       </service>
       <service>
          <numService>2</numService>
          <nomDeService>Direction</nomDeService>
       </service>
       <service>
          <numService>3r</numService>
          <nomDeService>Courrier</nomDeService>
       </service>
       <service>
          <numService>4</numService>
          <nomDeService>Direction</nomDeService>
       </service>
       <service>
          <numService>5</numService>
          <nomDeService>Représentation</nomDeService>
       </service>
     </services>
     
     
     <!-- pers06.xml -->
     <personnes>
       <personne ddn="1965">
          <nom>DUPUIS</nom>
          <prénom>Isabelle</prénom>
          <numService>1</numService>
       </personne>
       <personne ddn="1963">
          <nom>DUPONT</nom>
          <prénom>Jean</prénom>
          <numService>1</numService>
       </personne>
       <personne ddn="1968">
          <nom>DUPONT</nom>
          <prénom>Jack</prénom>
          <numService>2</numService>
       </personne>
     </personnes>
     </agence>
     
     # rxp agences04.xml
     
     <?xml version="1.0" encoding="ISO-8859-1"?>
     <!-- fichier agences04 construit à partir de serv07 et pers07 -->
     <!DOCTYPE agence [
       <!ENTITY services  SYSTEM "serv07.xml">
       <!ENTITY personnes SYSTEM "pers07.xml">
     ]>
     <agence>
     
     <!-- serv07.xml -->
     <services>
       <service nomService="Achats" numService="1"/>
       <service nomService="Direction" numService="2"/>
       <service nomService="Courrier" numService="3"/>
       <service nomService="Représentation" numService="4"/>
     </services>
     
     
     <!-- pers07.xml -->
     <personnes>
       <personne prénom="Isabelle" nom="DUPUIS" ddn="1965" numService="1"/>
       <personne prénom="Jean" nom="DUPONT" ddn="1963" numService="1"/>
       <personne prénom="Jack" nom="DUPONT" ddn="1968" numService="2"/>
     </personnes>
     
     </agence>
     

Firefox ne réalise pas les inclusions si on utilise des entités de type caractères dans une DTD interne : si on ouvre agences03.xml avec Firefox, le document semble vide. Idem avec Chrome et Opera.

Il n'est pas possible de vérifier que les inclusions sont effectives et valides à l'aide de xmllint directement parce que par défaut xmllint ne réalise pas les inclusions. A l'aide des commandes xmllint --help | grep entity on voit qu'il faut rajouter le paramètre --noent pour que xmllint réalise les inclusions.

Il ne semble pas facile de savoir si xmlstarlet réalise ou non pas les inclusions des entités de type caractères dans une DTD interne. A l'aide des commandes xmlstarlet el agences03.xml on voit que pour que xmlstarlet ne réalise pas les inclusions en standard. On aurait aussi pu faire une erreur dans pers06.xml et regarder si les logiciels affichent des erreurs :


     @ghchu5~/public_html/internet/L2Xml|(~gH) > rxp -s pers06.xml
     
     Error: Mismatched end tag: expected </personnes>, got </personne>
     in unnamed entity at line 19 char 11 of file:///home/gh/public_html/internet/L2Xml/pers06.xml
     
     
     @ghchu5~/public_html/internet/L2Xml|(~gH) > rxp -s agences03.xml
     
     Error: Mismatched end tag: expected </personnes>, got </personne>
      in entity "personnes" at line 19 char 11 of file:///home/gh/public_html/internet/L2Xml/pers06.xml
      in unnamed entity at line 13 char 13 of file:///home/gh/public_html/internet/L2Xml/agences03.xml
     
     
     @ghchu5~/public_html/internet/L2Xml|(~gH) > xmllint -noout agences03.xml
     
     @ghchu5~/public_html/internet/L2Xml|(~gH) > xmllint -noout --noent agences03.xml
     
     pers06.xml:19: parser error : Opening and ending tag mismatch: personnes line 3 and personne
     </personne>
                ^
     pers06.xml:20: parser error : chunk is not well balanced
     agences03.xml:13: parser error : Failure to process entity personnes
     &personnes;
                 ^
     agences03.xml:13: parser error : Entity 'personnes' not defined
     &personnes;
                 ^
     @ghchu5~/public_html/internet/L2Xml|(~gH) > xmlstarlet val -w -e agences03.xml
     agences03.xml - valid
     

Une lecture attentive du manuel de xmlstarlet, pourtant très détaillé, ne semble pas fournir la solution. Toutefois, elle existe cependant, via l'option c14n qui réalise l'inclusion :


      $gh> xmlstarlet c14n agences03.xml
     
            <!-- agences03.xml -->
            <!-- fichier agences03 construit à partir de serv06 et pers06 -->
            <agence>
     
            <!-- serv06.xml -->
            <services>
              <service>
                 <numService>1</numService>
                 <nomDeService>Achats</nomDeService>
              </service>
              <service>
            [...]
     
      $gh> rxp agences03.xml             > agences03_via_rxp.xml
     
      $gh> xmlstarlet c14n agences03.xml > agences03_expanded.xml
     
      $gh> ls -al agences03*xml
     
      -rw-r--r-- 1 gh gh  303 déc.   1  2017 agences03.xml
      -rw-rw-r-- 1 gh gh 1080 févr.  8 12:38 agences03_expanded.xml
      -rw-rw-r-- 1 gh gh 1239 févr.  8 12:40 agences03_via_rxp.xml
     

 

5. Bases de données et XML ; espaces de noms

Peut-on facilement exporter une base de données MySQL en XML ?

Application : exporter la base GESTION qui contient les 4 tables FOUR, CLI, ART et CMD de notre tuteur MySql. Un script qui permet de recréer les tables et leur contenu est BD_gestion_mysql.

Pour les plus fort(e)s, on utilisera le docker nommé _php7 afin de créer BD_gestion_mysql.xml à l'aide de http://localhost/phpmyadmin ou en ligne de commandes. Pour les autres, on se contentera de rapatrier BD_gestion_mysql.xml.

On peut imaginer qu'une mauvaise conception d'une base de données ait abouti à un champ NOM pour le nom d'un fournisseur, à un champ NOM pour le nom d'un client et à un champ NOM pour le nom d'un article. Si on veut que ces trois noms soient désignés de façon différente, trouver une solution avec des attributs qui conserve la désignation <NOM> puis montrer comment les notions de namespace et de XML namespace permettent de «bien» gérer cette mauvaise conception. On pourra, pour tester la solution, utilisera comme point de départ le fichier de test noms.xml.

Solution :  

Si on lit l'aide de la commande mysql_dump, dont une copie est ici, on peut voir qu'il existe une option de sortie nommé --xml. Ainsi, la commande mysqldump --xml --database gestion > BD_gestion_mysql.xml produit le fichier BD_gestion_mysql.xml. On remarquera que chaque table donne lieu à deux éléments nommés respectivement table_structure et table_data, eux-mêmes inclus dans un élément database, ce qui montre qu'on pourrait "dumper" plusieurs bases de données d'un coup.

La structuration utilisée pour les tables, qui peut s'apliquer à n'importe quelle table puisqu'elle nomme les éléments ligne (row) et champ (field), n'est sans doute pas la plus adaptée à un traitement efficace des données. Par exemple, au lieu de


     <row>
       <field name="na">1</field>
       <field name="nom">VELO ENFANT</field>
       ...
     
     

il serait sans doute plus explicite d'utiliser


     <ligneArticle>
       <numéroArticle>1</numéroArticle>
       <nomArticle>VELO ENFANT</nomArticle>
       ...
     

Voici par exemple les deux premières lignes de la table elf de la base statdata dans un format légèrement arrangé :


     @ghchu5~/public_html/internet/L2Xml|(~gH) > sql --html
     
     Welcome to the MySQL monitor.  Commands end with ; or \g.
     Server version: 5.7.25-0ubuntu0.16.04.2 (Ubuntu)
     [...]
     
     mysql> use statdata ;
     Database changed
     
     mysql> select * from elf limit 2 ;
     
     <TABLE BORDER=1>
       <TR>
          <TH>IDEN</TH><TH>SEXE</TH><TH>AGE</TH><TH>PROF</TH><TH>ETUD</TH><TH>REGI</TH><TH>USAL</TH>
       </TR>
       <TR>
          <TD>M001</TD><TD>1</TD><TD>62</TD><TD>1</TD><TD>2</TD><TD>2</TD><TD>3</TD>
       </TR>
       <TR>
          <TD>M002</TD><TD>0</TD><TD>60</TD><TD>9</TD><TD>3</TD><TD>4</TD><TD>1</TD>
       </TR>
     </TABLE>
     
     2 rows in set (0,00 sec)
     
     mysql> quit
     Bye
     
     ###########################################################################
     
     @ghchu5~/public_html/internet/L2Xml|(~gH) > sql --xml
     
     Welcome to the MySQL monitor.  Commands end with ; or \g.
     [...]
     
     mysql> use statdata ;
     Database changed
     
     mysql> select * from elf limit 2 ;
     <?xml version="1.0"?>
     
     <resultset statement="select * from elf limit 2;" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     
       <row>
        <field name="IDEN">M001</field>
        <field name="SEXE">1</field>
        <field name="AGE">62</field>
        <field name="PROF">1</field>
        <field name="ETUD">2</field>
        <field name="REGI">2</field>
        <field name="USAL">3</field>
       </row>
     
       <row>
        <field name="IDEN">M002</field>
        <field name="SEXE">0</field>
        <field name="AGE">60</field>
        <field name="PROF">9</field>
        <field name="ETUD">3</field>
        <field name="REGI">4</field>
        <field name="USAL">1</field>
       </row>
     </resultset>
     
     2 rows in set (0,00 sec)
     
     mysql> quit
     Bye
     
     

Pour utiliser des namespaces, il suffit de définir leurs préfixes au niveau de l'élément racine et d'utiliser ensuite les préfixes là où on en a besoin. Le fichier nomsAvecNs.xml contient une solution avec des préfixes courts et nomsAvecNsLongs.xml contient une solution avec des préfixes longs. Si le gain en lisibilité et en non-ambiguité n'est pas si flagrant que cela (après tout, <fournisseur>...<f:nom> est suffisamment explicite), l'utilité de la notion d'espace de 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 le fichier gestionSansNs.xml suivant


     <?xml version="1.0" encoding="ISO-8859-1"?>
     
     <!-- fichier gestionSansNs.xml -->
     <!-- version sans "namespace"  -->
     
     <commandes>
     
      <extrait>
        <commande numéro="4">
          <nom>DUPONT</nom>
          a acheté <nombre>1</nombre>
          <nom>VELO ENFANT</nom>
          de chez
          <nom>Jouets S.A.</nom>
          .
        </commande>
      </extrait>
     
     </commandes>
     

comporte des ambiguités là où le fichier gestionAvecNs.xml dont le contenu est listé ci-dessous


     <?xml version="1.0" encoding="ISO-8859-1"?>
     
     <!-- fichier gestionAvecNs.xml    -->
     <!-- version avec des "namespace" -->
     
     <commandes
       xmlns:fournisseur="http://gh_fournisseurs"
       xmlns:client="http://gh_clients"
       xmlns:article="http://gh_articles"
     >
     
      <extrait>
        <commande numéro="4">
          <client:nom>DUPONT</client:nom>
          a acheté <nombre>1</nombre>
          <article:nom>VELO ENFANT</article:nom>
          de chez
          <fournisseur:nom>Jouets S.A.</fournisseur:nom>
          .
        </commande>
      </extrait>
     
     </commandes>
     

n'en a aucune.

 

6. Formats XML usuels en bioinformatique

Le NCBI est un institut national américain qui fournit de nombreuses ressources en bioinformatique. Cherchez sur la page principale du site dans la base de données des protéines, le mot AAA18335 puis le mot 424143. Comment est affichée la séquence en acides aminés de la protéine correspondante ?

Afin d'éviter d'encombrer les serveurs, le NCBI propose un script pour accéder aux protéines nommé efetch. Après avoir lu la documentation correspondante, trouvez la syntaxe associée à la demande du fichier XML complet («Genpept») pour la protéine précédente. Comment est stockée la séquence en acides aminés de la protéine correspondante ? Et si on se focalise sur la séquence Fasta (via le format «TinySeq»), que faut-il changer au niveau du script ?

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. Comment fait-on pour voir le fichier XML correspondant ? Comment est stockée la séquence en acides aminés de la protéine correspondante ? A quoi correspond le format RDF proposé en haut et à droite du format XML dans la page Web de visualisation de la protéine ?

Décrire puis donner la structure du fichier P14602.xml et du fichier P14602.rdf.

Solution :  

L'adresse officielle du NCBI est http://www.ncbi.nlm.nih.gov/. Il faut choisir la base de données «Protein» parmi celles proposées sur la page d'accueil pour faire l'exercice.

Il est aussi possible d'utiliser directement l'adresse http://www.ncbi.nlm.nih.gov/protein/ pour restreindre la recherche aux protéines dans cette base de données. L'utilisation du panneau d'interrogation avec les deux références AAA18335 et 424143 fournit deux URL différentes, http://www.ncbi.nlm.nih.gov/protein/AAA18335 et http://www.ncbi.nlm.nih.gov/protein/424143 mais qui contiennent exactement les mêmes informations car elles correspondent à la même protéine HSP 27 [Mus musculus].

Si on cherche ncbi efetch avec Google, on obtient la page d'aide à l'adresse http://www.ncbi.nlm.nih.gov/books/NBK25499/#chapter4.EFetch. Une lecture attentive de la page ciblée sur l'expression db=protein permet de voir qu'il y a deux appels possibles du script cgi, l'un nommé gp qui correspond au format complet Genpept et l'autre nommé fasta, qui correspond à TinySeq. Les URL correspondantes sont : http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=protein&id=424143&rettype=gp&retmode=xml et http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=protein&id=424143&rettype=fasta&retmode=xml. On note bien évidemment que l'URL se termine par retmode=xml de façon à obtenir un fichier XML. La première URL renvoie un fichier sequence.gbx.xml de DTD GBSet dont le contenu est consultable ici alors que la seconde renvoie un fichier sequence.fasta.xml de DTD TSeqSet dont le contenu est consultable .

Pour Uniprot, dont le site officiel est http://www.uniprot.org/, une recherche dans la PK (Protein KnowledgeBase) nommée UniProtKB ne donne aucune réponse satisfaisante pour 424143 (soit l'URL http://www.uniprot.org/uniprot/?query=424143). Par contre, avec AAA18335 nous pouvons retrouver la protéine HSP 27 [Mus musculus] : http://www.uniprot.org/uniprot/?query=AAA18335. Son numéro de référence pour Uniprot est P14602, ce qui permet de construire l'URL de la page de visualisation http://www.uniprot.org/uniprot/P14602, celle de son fichier XML http://www.uniprot.org/uniprot/P14602.xml, celle de son fichier RDF : http://www.uniprot.org/uniprot/P14602.rdf et même celle de son fichier FASTA si on en a besoin : http://www.uniprot.org/uniprot/P14602.fasta.

Voici les structures utilisées pour stocker les séquences Fasta (des retours-charriot ont été ajoutés pour la lisibilité) :


     [NCBI GENPEPT TXT]
     
             1 mterrvpfsl lrtpswgpfr dwypahsrlf dqafgvprlp dewsqwfsaa gwpgyvrplp
            61 aataeglavt laapafsral nrqlssgvse irqtadrwrv sldvnhfape eltvktkegv
           121 veitgkheer qdehgyisrc ftrkytlppg vdptlvsssl spegtltvea plpkavtqsa
           181 eitipvtfea raqiggpeag kseqsgak
     //
     
     [NCBI GENPEPT XML]
     
     <GBSeq_sequence>
     mterrvpfsllrtpswgpfrdwypahsrlfdqafgvprlpdewsqwfsaagwpgyvrplp
     aataeglavtlaapafsralnrqlssgvseirqtadrwrvsldvnhfapeeltvktkegv
     veitgkheerqdehgyisrcftrkytlppgvdptlvssslspegtltveaplpkavtqsa
     eitipvtfearaqiggpeagkseqsgak
     </GBSeq_sequence>
     
     [NCBI TINYSEQ XML]
     
     <TSeq_sequence>
     MTERRVPFSLLRTPSWGPFRDWYPAHSRLFDQAFGVPRLPDEWSQWFSAAGWPGYVRPLP
     AATAEGLAVTLAAPAFSRALNRQLSSGVSEIRQTADRWRVSLDVNHFAPEELTVKTKEGV
     VEITGKHEERQDEHGYISRCFTRKYTLPPGVDPTLVSSSLSPEGTLTVEAPLPKAVTQSA
     EITIPVTFEARAQIGGPEAGKSEQSGAK
     </TSeq_sequence>
     
     [UNIPROT XML]
     
     <sequence length="209" mass="23014" checksum="31BD9FAF4E107C50" modified="1994-06-01" version="3">
     MTERRVPFSLLRSPSWEPFRDWYPAHSRLFDQAFGVPRLPDEWSQWFSAAGWPGYVRPLP
     AATAEGPAAVTLAAPAFSRALNRQLSSGVSEIRQTADRWRVSLDVNHFAPEELTVKTKEG
     VVEITGKHEERQDEHGYISRCFTRKYTLPPGVDPTLVSSSLSPEGTLTVEAPLPKAVTQS
     AEITIPVTFEARAQIGGPEAGKSEQSGAK
     </sequence>
     
     [UNIPROT FASTA]
     
     >sp|P14602|HSPB1_MOUSE Heat shock protein beta-1 OS=Mus musculus GN=Hspb1 PE=1 SV=3
     MTERRVPFSLLRSPSWEPFRDWYPAHSRLFDQAFGVPRLPDEWSQWFSAAGWPGYVRPLP
     AATAEGPAAVTLAAPAFSRALNRQLSSGVSEIRQTADRWRVSLDVNHFAPEELTVKTKEG
     VVEITGKHEERQDEHGYISRCFTRKYTLPPGVDPTLVSSSLSPEGTLTVEAPLPKAVTQS
     AEITIPVTFEARAQIGGPEAGKSEQSGAK
     
     

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. Pour Uniprot, des outils de vérification comme la longueur de la séquence et sa "checksum" sont fournies comme attribut.

Le fichier RDF associé à la protéine, soit http://www.uniprot.org/uniprot/P14602.rdf permet d'appliquer les concepts du web sémantique aux données d'Uniprot.

Le fichier P14602.xml contient 990 lignes, 55 éléments seuls, 107 éléments et attributs. Sa structure, sous forme hiérarchique d'élements et d'attributs est dans le fichier P14602-xml-structure.txt


      $gh> wc -l  P14602.xml
           990 P14602.xml
     
      $gh> xmlstarlet el P14602.xml | sort -u | wc -l
           55
     
      $gh> xmlstarlet el -a P14602.xml | sort -u | wc -l
           107
     
      $gh> xmlstarlet el -a P14602.xml | sort -u > P14602-xml-structure.txt
     
     
      $gh> # MIEUX :
     
      $gh> xmlstarlet el -a P14602.xml | sort -u | tee P14602-xml-structure.txt | head
     
           uniprot
           uniprot/copyright
           uniprot/entry
           uniprot/entry/accession
           uniprot/entry/comment
           uniprot/entry/comment/event
           uniprot/entry/comment/event/@type
           uniprot/entry/comment/isoform
           uniprot/entry/comment/isoform/id
           uniprot/entry/comment/isoform/name
     

Le fichier P14602.rdf contient 1992 lignes, 67 éléments seuls, 133 éléments et attributs. Sa structure, sous forme hiérarchique d'élements et d'attributs est dans le fichier P14602-rdf-structure.txt


      $gh> wc -l P14602.rdf
           1992 P14602.rdf
     
      $gh> xmlstarlet el P14602.rdf | sort -u | wc -l
           67
     
      $gh> xmlstarlet el -a P14602.rdf | sort -u | wc -l
           133
     
      $gh> xmlstarlet el -a P14602.rdf | sort -u | tee P14602-rdf-structure.txt | head
           rdf:RDF
           rdf:RDF/owl:Ontology
           rdf:RDF/owl:Ontology/owl:imports
           rdf:RDF/owl:Ontology/owl:imports/@rdf:resource
           rdf:RDF/owl:Ontology/@rdf:about
           rdf:RDF/rdf:Description
           rdf:RDF/rdf:Description/alternativeName
           rdf:RDF/rdf:Description/alternativeName/@rdf:resource
           rdf:RDF/rdf:Description/annotation
           rdf:RDF/rdf:Description/annotation/@rdf:ID
     

 

Code-source php de cette page.

 

 

retour gH    Retour à la page principale de   (gH)