Valid XHTML     Valid CSS2    

Développement Web et représentation de données :

Technologie XML, DTD, XSD et XSL ;

applications à la bureautique et à la bioinformatique

Exercices corrigés, série 1 : structuration XML

                     gilles.hunault "at" univ-angers.fr

 

Table des matières cliquable

  1. Installation des outils logiciels

  2. Structuration de services

  3. Structuration de personnes, VCARD et XCARD

  4. Structuration de séquences Fasta

  5. Structuration de personnes et de services

  6. Formats XML usuels en bureautique

  7. Formats XML usuels en bioinformatique

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

  9. Dessins et rendus XML

10. Lecture de fichiers XML sur Internet et logiciel R

11. Questions diverses

 

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

 

1. Installation des outils logiciels

Installer sous Linux les outils en ligne de commande nommés recode, rxp, xmllint, xmlstarlet, xsltproc puis les modules XML::Parser, XML::Checker, XML::SAX, XML::Validator::Schema et XML::XSLT pour perl.

Où sont les pages d'aides associées ?

Vérifier que le script demoXml fourni dans l'archive demoXml.zip fournit les mêmes résultats que dans le listing de sortie demoXml.txt et que vous comprenez les affichages. On pourra essayer de retenir les principales options des outils en ligne de commande. On utilisera bien sûr les fichiers suivants :

Fichier Explications
dbf.xml fichier xml bien formé
dmf.xml fichier xml mal formé
adv.xml fichier xml valide pour la grammaire id.dtd
adn.xml fichier xml invalide pour la grammaire id.dtd
id.dtd fichier grammaire de type dtd
axv.xml fichier xml valide pour la grammaire id.xsd
axn.xml fichier xml invalide pour la grammaire id.xsd
id.xsd fichier grammaire de type xsd (schéma)
cours.xml fichier xml auquel appliquer la transformation .xsl
cours.xsl fichier xml qui est une transformation xsl

Ecrire un script iso2utf et un script utf2iso pour convertir les accents à l'aide de recode (plutôt que iconv).

Tester ces scripts avec les fichiers accentsIso.txt, accentsHtml.txt et accentsUtf.txt. Un fichier plus complet en iso est allcharIso.txt.

Solution :  

Pour rxp, on peut exécuter sudo apt-get install rxp.
La page officielle pour rxp est http://www.cogsci.ed.ac.uk/~richard/rxp.html. La page d'aide (man) est http://www.cogsci.ed.ac.uk/~richard/rxp.txt dont une version un peu plus lisible est ici. Une autre page d'aide est (merci à M. Racine et R. Gaborieau de nous l'avoir signalée).

xmllint fait partie du package libxml2-utils, installable aussi par apt-get ou via http://xmlsoft.org. La page d'aide est http://xmlsoft.org/xmllint.html.

On peut trouver la page d'aide pour xmlstarlet sur sourceforge : xmlstarlet-ug.html.

On peut trouver la page d'aide pour xsltproc sur le site xmlsoft : xsltproc2.html.

Pour perl, installer le module MMM peut se faire en ligne de commande via sudo perl -MCPAN -e 'install MODULE::MMM'.
Voir le détail des commentaires en haut du fichier demoXml.

La syntaxe de recode, qu'on installe par apt-get est la suivante : recode ISO-8859-15..UTF8 fichier.

La syntaxe de iconv qu'on installe par sudo apt-get install libc-bin est la suivante : iconv -f ISO_8859-15 -t UTF-8 fichier_original > fichier_modifié.

Le script iso2utf est donc tout simplement le fichier qui contient recode ISO-8859-15..UTF8 $1 rendu exécutable par chmod +x.

Pour être sûr que tout est bien installé, il faut exécuter les commandes suivantes


     # document bien formé
     
     testebfpe dbf.xml
     testebfpe dmf.xml
     testebfph dbf.xml
     testebfph dmf.xml
     testebfj  dbf.xml
     testebfj  dmf.xml
     rxp       dbf.xml
     rxp -s    dbf.xml
     rxp       dmf.xml
     rxp -s    dmf.xml
     xmllint         dbf.xml
     xmllint --noout dbf.xml
     xmllint --noout dmf.xml
     xmlstarlet val    -w dbf.xml
     xmlstarlet val    -w dmf.xml
     xmlstarlet val -e -w dmf.xml
     
     # document valide (dtd)
     
     testevdpe adv.xml id.dtd
     testevdpe adn.xml id.dtd
     testevdph adv.xml id.dtd
     testevdph adn.xml id.dtd
     testevdj  adv.xml
     testevdj  adn.xml
     rxp -V -s adv.xml
     rxp -V -s adn.xml
     xmllint --noout --valid adv.xml
     xmllint --noout --valid adn.xml
     xmllint --noout --dtdvalid id.dtd --valid adn.xml
     xmlstarlet val    -d id.dtd adv.xml
     xmlstarlet val    -d id.dtd adn.xml
     xmlstarlet val -e -d id.dtd adn.xml
     
     # document valide (xsd)
     
     testevspe axv.xml id.xsd
     testevspe axn.xml id.xsd
     testevsph axv.xml id.xsd
     testevsph axn.xml id.xsd
     testevsj  axv.xml id.xsd
     testevsj  axn.xml id.xsd
     xmllint --noout --schema id.xsd axv.xml
     xmllint --noout --schema id.xsd axn.xml
     xmlstarlet val -s    id.xsd axv.xml
     xmlstarlet val -e -s id.xsd axn.xml
     
     # transformation xsl
     
     xsltph
     xsltph cours.xml cours.xsl
     
     xsltpe
     xsltpe cours.xml cours.xsl
     
     # attention à l'ordre des paramètres
     xsltproc cours.xsl cours.xml
     
     

 

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

 

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

 

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

 

5. Structuration de personnes et de services

Ecrire dans agence01.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.

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, xmllint ou xmlstarlet :


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

 

6. Formats XML usuels en bureautique

Dans quelle mesure peut-on dire qu'un fichier-archive, une base de données et un fichier XML sont des conteneurs ?

Ecrire le texte «Bon courage à tous et à toutes» -- exactement comme cela, avec courage en gras, tous en bleu et toutes en gras et bleu foncé -- dans un fichier Word au format DOCX, puis au format RTF ; écrire le même texte dans un fichier Libre Office au format Texte ODT. Si ce sont des fichiers XML, pourquoi ne peut-on pas les ouvrir directement avec un éditeur de texte ? A quoi correspond le format .FODT ?

Reprendre avec les informations ci-dessous (fichier tableur_data.txt) qu'on mettra dans les cellules d'un tableur, qu'on sauvegardera au format XLSX, CSV et Classeur ODS :


     Iden       Longueur
     1906384B   110
     1YYCA      174
     A2XG55     33
     

Solution :  

Un fichier-archive, une base de données MySql, un document XML, un objet (au sens de la programmation objets) ou même un DVD du commerce sont des conteneurs dans la mesure où ils permettent de regrouper des contenus (données) hétérogènes : une base de données contient des tables qui elle-mêmes contiennent des champs, l'élément racine du document XML peut contenir d'autres éléments qui peuvent contenir eux-mêmes d'autres éléments, un objet en PO peut contenir plusieurs variables-mémoires, voire plusieurs tableaux ou d'autres objets, un DVD du commerce contient des vidéos, des sous-titres, voire des menus, des images... Ce qu'apporte en plus XML et l'objet, c'est la possibilité d'agir sur leurs contenus...

On pourrait exporter une base de données en XML avec la structure suivante (MySql dispose d'une option de sortie HTML et d'une option de sortie XML qui ressemble un peu à celle-ci) :


     <baseDeDonnées>
     
       <table1>
         <ligne1>
            <colonne1>
             [... données de la table 1]
            </colonne1>
            <colonne2>
            ...
            </colonne2>
            ...
         <ligne1>
       </table1>
     
       <table2>
         [... données de la table 2]
       </table2>
     
       ...
     
     </baseDeDonnées>
     

Les fichiers .ODS et .DOCX sont des documents compressés, c'est-à-dire des archives et ne peuvent donc pas être lus directement. Seul le format .RTF est lisible, si l'on peut dire. En voici le contenu :


     {\rtf1\ansi\deff3\adeflang1025
     {\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}
      {\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset128 Times New Roman;}
       {\f4\fswiss\fprq2\fcharset128 Arial;}{\f5\fnil\fprq2\fcharset128 WenQuanYi Micro Hei;}
        {\f6\fnil\fprq2\fcharset128 Lohit Hindi;}{\f7\fnil\fprq0\fcharset128 Lohit Hindi;}}
     {\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red128\green128\blue128;}
     {\stylesheet{\s0\snext0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}
      \cf0\kerning1\hich\af5\langfe2052\dbch\af6\afs24\alang1081\loch\f3\fs24\lang1036 Standard;}
     {\*\cs15\snext15\b\ab Accentuation forte;}
     {\s16\sbasedon0\snext17\sb240\sa120\keepn\hich\af5\dbch\af6\afs28\loch\f4\fs28 Titre;}
     {\s17\sbasedon0\snext17\sb0\sa120 Corps de texte;}
     {\s18\sbasedon17\snext18\sb0\sa120\dbch\af7 Liste;}
     {\s19\sbasedon0\snext19\sb120\sa120\noline\i\dbch\af7\afs24\ai\fs24 L\u233\'3fgende;}
     {\s20\sbasedon0\snext20\noline\dbch\af7 Index;}
     }{\info{\author Hunault }{\creatim\yr2012\mo7\dy23\hr22\min18}{\revtim\yr0\mo0\dy0\hr0\min0}
     {\printim\yr0\mo0\dy0\hr0\min0}{\comment LibreOffice}{\vern3500}}\deftab709
     
     {\*\pgdsctbl
     {\pgdsc0\pgdscuse195\pgwsxn11906\pghsxn16838\marglsxn1134\margrsxn1134
      \margtsxn1134\margbsxn1134\pgdscnxt0 Standard;}}
     \formshade\paperh16838\paperw11906\margl1134\margr1134\margt1134\margb1134
     \sectd\sbknone\sectunlocked1\pgndec\pgwsxn11906\pghsxn16838\marglsxn1134
     \margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc
     \aftnrstcont\aftnstart1\aftnnrlc
     \pgndec\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}
     \cf0\kerning1\hich\af5\langfe2052\dbch\af6\afs24\alang1081\loch\f3\fs24\lang1036
     {\cs15\b\ab\b0\ab0\rtlch \ltrch\loch
     Bon }{\cs15\b\ab\b\ab\rtlch \ltrch\loch
     courage}{\cs15\b\ab\b0\ab0\rtlch \ltrch\loch
      \uc2 \u224\'c3\'a0 \uc1 }{\cs15\b\ab\cf2\b0\ab0\rtlch \ltrch\loch
     tous}{\cs15\b\ab\b0\ab0\rtlch \ltrch\loch
      et \uc2 \u224\'c3\'a0 \uc1 }{\cs15\b\ab\cf2\b\ab\rtlch \ltrch\loch
     toutes}
     \par }
     

Un afffichage plus lisible pour un fichier similaire se trouve à l'adresse courage.rtfste qui correspond à l'exercice 9 de nos exercices PHP série 1 (énoncé, solution). On pourra aussi consulter l'exercice 1 de notre cours FarCompr, partie stockage (énoncé,solution).

Pour retrouver les fichiers des archives, il suffit d'utiliser un décompresseur comme unzip par exemple :


     $gh> unzip -v boncourage.odt
     
     Archive:  boncourage.odt
      Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
     --------  ------  ------- ---- ---------- ----- --------  ----
           39  Stored       39   0% 2012-07-23 20:24 0c32c65e  mimetype
          869  Stored      869   0% 2012-07-23 20:24 8a9d38c1  meta.xml
         9005  Defl:N     1393  85% 2012-07-23 20:24 7685b30d  settings.xml
         4469  Defl:N      966  78% 2012-07-23 20:24 7ee053d5  content.xml
         1240  Stored     1240   0% 2012-07-23 20:24 1549604c  Thumbnails/thumbnail.png
          899  Defl:N      261  71% 2012-07-23 20:24 d268f7b4  manifest.rdf
            0  Stored        0   0% 2012-07-23 20:24 00000000  Configurations2/images/Bitmaps/
            0  Stored        0   0% 2012-07-23 20:24 00000000  Configurations2/popupmenu/
            0  Stored        0   0% 2012-07-23 20:24 00000000  Configurations2/toolpanel/
            0  Stored        0   0% 2012-07-23 20:24 00000000  Configurations2/statusbar/
            0  Stored        0   0% 2012-07-23 20:24 00000000  Configurations2/progressbar/
            0  Stored        0   0% 2012-07-23 20:24 00000000  Configurations2/toolbar/
            0  Stored        0   0% 2012-07-23 20:24 00000000  Configurations2/floater/
            0  Stored        0   0% 2012-07-23 20:24 00000000  Configurations2/menubar/
            0  Defl:N        2   0% 2012-07-23 20:24 00000000  Configurations2/accelerator/current.xml
        11214  Defl:N     2071  82% 2012-07-23 20:24 7b480a79  styles.xml
         1086  Defl:N      289  73% 2012-07-23 20:24 1205fba3  META-INF/manifest.xml
     --------          -------  ---                            -------
        28821             7130  75%                            17 files
     
     $gh> unzip -v boncourage.docx
     
     Archive:  boncourage.docx
      Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
     --------  ------  ------- ---- ---------- ----- --------  ----
          573  Defl:N      217  62% 2012-07-23 20:23 2301d0e8  _rels/.rels
          595  Defl:N      224  62% 2012-07-23 20:23 21e3b303  word/fontTable.xml
          400  Defl:N      184  54% 2012-07-23 20:23 6294fd88  word/_rels/document.xml.rels
         1521  Defl:N      484  68% 2012-07-23 20:23 218c2506  word/document.xml
         2085  Defl:N      604  71% 2012-07-23 20:23 458984fb  word/styles.xml
          267  Defl:N      163  39% 2012-07-23 20:23 8f99c3e9  docProps/app.xml
          509  Defl:N      284  44% 2012-07-23 20:23 3004c3c0  docProps/core.xml
          987  Defl:N      286  71% 2012-07-23 20:23 606aa6aa  [Content_Types].xml
     --------          -------  ---                            -------
         6937             2446  65%                            8 files
     
     
     

Les «vrais» fichiers pour Open Office et Microsoft Office sont nommés respectivement content.xml et document.xml :


     $gh> cat content.xml
     
     <?xml version="1.0" encoding="UTF-8"?>
     <office:document-content
     xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
     xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
     xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
     xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
     xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
     xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
     xmlns:xlink="http://www.w3.org/1999/xlink"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
     xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
     xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
     xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
     xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"
     xmlns:math="http://www.w3.org/1998/Math/MathML"
     xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
     xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
     xmlns:ooo="http://openoffice.org/2004/office"
     xmlns:ooow="http://openoffice.org/2004/writer"
     xmlns:oooc="http://openoffice.org/2004/calc"
     xmlns:dom="http://www.w3.org/2001/xml-events"
     xmlns:xforms="http://www.w3.org/2002/xforms"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:rpt="http://openoffice.org/2005/report"
     xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2"
     xmlns:xhtml="http://www.w3.org/1999/xhtml"
     xmlns:grddl="http://www.w3.org/2003/g/data-view#"
     xmlns:tableooo="http://openoffice.org/2009/table"
     xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0"
     xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0"
     xmlns:css3t="http://www.w3.org/TR/css3-text/"
     office:version="1.2"><office:scripts/>
     
     <office:font-face-decls><style:font-face style:name="Lohit Hindi1" svg:font-family="&apos;Lohit Hindi&apos;"/>
     <style:font-face style:name="Times New Roman" svg:font-family="&apos;Times New Roman&apos;" style:font-family-generic="roman"
     style:font-pitch="variable"/><style:font-face style:name="Arial" svg:font-family="Arial" style:font-family-generic="swiss"
     style:font-pitch="variable"/><style:font-face style:name="Lohit Hindi" svg:font-family="&apos;Lohit Hindi&apos;"
     style:font-family-generic="system" style:font-pitch="variable"/><style:font-face style:name="WenQuanYi Micro Hei"
     svg:font-family="&apos;WenQuanYi Micro Hei&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
     </office:font-face-decls><office:automatic-styles><style:style style:name="T1" style:family="text">
     <style:text-properties fo:font-weight="normal" style:font-weight-asian="normal" style:font-weight-complex="normal"/>
     </style:style><style:style style:name="T2" style:family="text"><style:text-properties fo:font-weight="bold"
     style:font-weight-asian="bold" style:font-weight-complex="bold"/></style:style><style:style style:name="T3"
     style:family="text"><style:text-properties fo:color="#0000ff" fo:font-weight="normal" style:font-weight-asian="normal"
     style:font-weight-complex="normal"/></style:style><style:style style:name="T4" style:family="text">
     <style:text-properties fo:color="#0000ff" fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/>
     </style:style></office:automatic-styles>
     
     <office:body>
     <office:text><text:sequence-decls><text:sequence-decl
     text:display-outline-level="0" text:name="Illustration"/><text:sequence-decl text:display-outline-level="0"
     text:name="Table"/><text:sequence-decl text:display-outline-level="0" text:name="Text"/><text:sequence-decl
     text:display-outline-level="0" text:name="Drawing"/></text:sequence-decls><text:p text:style-name="Standard">
     <text:span text:style-name="Strong_20_Emphasis"><text:span text:style-name="T1">Bon </text:span></text:span>
     <text:span text:style-name="Strong_20_Emphasis"><text:span text:style-name="T2">courage</text:span></text:span>
     <text:span text:style-name="Strong_20_Emphasis"><text:span text:style-name="T1"> à </text:span></text:span>
     <text:span text:style-name="Strong_20_Emphasis"><text:span text:style-name="T3">tous</text:span></text:span>
     <text:span text:style-name="Strong_20_Emphasis"><text:span text:style-name="T1"> et à </text:span></text:span>
     <text:span text:style-name="Strong_20_Emphasis"><text:span text:style-name="T4">toutes</text:span></text:span>
     </text:p></office:text>
     </office:body>
     
     </office:document-content>
     
     $gh> cat word/document.xml
     
     <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
     
     <w:document
     xmlns:o="urn:schemas-microsoft-com:office:office"
     xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
     xmlns:v="urn:schemas-microsoft-com:vml"
     xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
     xmlns:w10="urn:schemas-microsoft-com:office:word"
     xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing">
     
     <w:body>
     <w:p><w:pPr><w:pStyle w:val="style0"/></w:pPr><w:r><w:rPr><w:rStyle w:val="style15"/><w:b w:val="false"/>
     <w:bCs w:val="false"/></w:rPr><w:t xml:space="preserve">Bon </w:t></w:r><w:r><w:rPr><w:rStyle w:val="style15"/>
     <w:b/><w:bCs/></w:rPr><w:t>courage</w:t></w:r><w:r><w:rPr><w:rStyle w:val="style15"/><w:b w:val="false"/>
     <w:bCs w:val="false"/></w:rPr><w:t xml:space="preserve"> à </w:t></w:r><w:r><w:rPr><w:rStyle w:val="style15"/>
     <w:b w:val="false"/><w:bCs w:val="false"/><w:color w:val="0000FF"/></w:rPr><w:t>tous</w:t></w:r><w:r><w:rPr>
     <w:rStyle w:val="style15"/><w:b w:val="false"/><w:bCs w:val="false"/></w:rPr><w:t xml:space="preserve"> et à
     </w:t></w:r><w:r><w:rPr><w:rStyle w:val="style15"/><w:b/><w:bCs/><w:color w:val="0000FF"/></w:rPr><w:t>toutes</w:t></w:r></w:p>
     <w:sectPr><w:type w:val="nextPage"/><w:pgSz w:h="16838" w:w="11906"/><w:pgMar w:bottom="1134" w:footer="0"
     w:gutter="0" w:header="0" w:left="1134" w:right="1134" w:top="1134"/><w:pgNumType w:fmt="decimal"/>
     <w:formProt w:val="false"/><w:textDirection w:val="lrTb"/></w:sectPr>
     </w:body>
     
     </w:document>
     
     
     
     

Si la documentation du Wiki français détaille ce que sont les fichiers Open Document, elle ne dit rien sur ce qu'est le format .FODT alors que la documentation du Wiki anglais explique qu'il s'agit d'un format «à plat» (non compressé) monobloc (tout en un seul fichier). On pourra le vérifier en consultant boncourage.fodt (judicieusement recopié en boncourage_fodt.xml) dont le contenu est :


     $gh> cat boncourage.fodt
     
     
     <?xml version="1.0" encoding="UTF-8"?>
     
     <office:document
     xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
     xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
     xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
     xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
     xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
     xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
     xmlns:xlink="http://www.w3.org/1999/xlink"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
     xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
     xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
     xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
     xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"
     xmlns:math="http://www.w3.org/1998/Math/MathML"
     xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
     xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
     xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0"
     xmlns:ooo="http://openoffice.org/2004/office"
     xmlns:ooow="http://openoffice.org/2004/writer"
     xmlns:oooc="http://openoffice.org/2004/calc"
     xmlns:dom="http://www.w3.org/2001/xml-events"
     xmlns:xforms="http://www.w3.org/2002/xforms"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:rpt="http://openoffice.org/2005/report"
     xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2"
     xmlns:xhtml="http://www.w3.org/1999/xhtml"
     xmlns:grddl="http://www.w3.org/2003/g/data-view#"
     xmlns:tableooo="http://openoffice.org/2009/table"
     xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0"
     xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0"
     xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text">
     
     <office:meta>
     <meta:initial-creator>Hunault </meta:initial-creator>
     <meta:creation-date>2012-07-23T22:18:01</meta:creation-date>
     <meta:generator>LibreOffice/3.5$Linux_X86_64 LibreOffice_project/350m1$Build-2</meta:generator>
     <meta:document-statistic meta:table-count="0" meta:image-count="0"
     meta:object-count="0" meta:page-count="1" meta:paragraph-count="1"
     meta:word-count="7" meta:character-count="30"
     meta:non-whitespace-character-count="24"/>
     </office:meta>
     
     <office:settings>
       <config:config-item-set config:name="ooo:view-settings">
        <config:config-item config:name="ViewAreaTop" config:type="long">0</config:config-item>
        <config:config-item config:name="ViewAreaLeft" config:type="long">0</config:config-item>
        <config:config-item config:name="ViewAreaWidth" config:type="long">19738</config:config-item>
        <config:config-item config:name="ViewAreaHeight" config:type="long">13741</config:config-item>
        <config:config-item config:name="ShowRedlineChanges" config:type="boolean">true</config:config-item>
        <config:config-item config:name="InBrowseMode" config:type="boolean">false</config:config-item>
        <config:config-item-map-indexed config:name="Views">
         <config:config-item-map-entry>
          <config:config-item config:name="ViewId" config:type="string">view2</config:config-item>
          <config:config-item config:name="ViewLeft" config:type="long">8246</config:config-item>
          <config:config-item config:name="ViewTop" config:type="long">3002</config:config-item>
          <config:config-item config:name="VisibleLeft" config:type="long">0</config:config-item>
          <config:config-item config:name="VisibleTop" config:type="long">0</config:config-item>
          <config:config-item config:name="VisibleRight" config:type="long">19736</config:config-item>
          <config:config-item config:name="VisibleBottom" config:type="long">13739</config:config-item>
          <config:config-item config:name="ZoomType" config:type="short">0</config:config-item>
          <config:config-item config:name="ViewLayoutColumns" config:type="short">0</config:config-item>
          <config:config-item config:name="ViewLayoutBookMode" config:type="boolean">false</config:config-item>
          <config:config-item config:name="ZoomFactor" config:type="short">135</config:config-item>
          <config:config-item config:name="IsSelectedFrame" config:type="boolean">false</config:config-item>
         </config:config-item-map-entry>
        </config:config-item-map-indexed>
       </config:config-item-set>
       <config:config-item-set config:name="ooo:configuration-settings">
        <config:config-item config:name="PrintTables" config:type="boolean">true</config:config-item>
        <config:config-item config:name="AddParaTableSpacingAtStart" config:type="boolean">true</config:config-item>
        <config:config-item config:name="ChartAutoUpdate" config:type="boolean">true</config:config-item>
        <config:config-item config:name="IsLabelDocument" config:type="boolean">false</config:config-item>
        <config:config-item config:name="MathBaselineAlignment" config:type="boolean">true</config:config-item>
        <config:config-item config:name="OutlineLevelYieldsNumbering" config:type="boolean">false</config:config-item>
        <config:config-item config:name="PrintLeftPages" config:type="boolean">true</config:config-item>
        <config:config-item config:name="AlignTabStopPosition" config:type="boolean">true</config:config-item>
        <config:config-item config:name="DoNotJustifyLinesWithManualBreak" config:type="boolean">false</config:config-item>
        <config:config-item config:name="PrintTextPlaceholder" config:type="boolean">false</config:config-item>
        <config:config-item config:name="UseOldNumbering" config:type="boolean">false</config:config-item>
        <config:config-item config:name="PrintProspectRTL" config:type="boolean">false</config:config-item>
        <config:config-item config:name="ProtectForm" config:type="boolean">false</config:config-item>
        <config:config-item config:name="CurrentDatabaseCommand" config:type="string"/>
        <config:config-item config:name="PrintBlackFonts" config:type="boolean">false</config:config-item>
        <config:config-item config:name="SmallCapsPercentage66" config:type="boolean">false</config:config-item>
        <config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item>
        <config:config-item config:name="PrintControls" config:type="boolean">true</config:config-item>
        <config:config-item config:name="PrintHiddenText" config:type="boolean">false</config:config-item>
        <config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item>
        <config:config-item config:name="UseFormerTextWrapping" config:type="boolean">false</config:config-item>
        <config:config-item config:name="PrintProspect" config:type="boolean">false</config:config-item>
        <config:config-item config:name="PrintEmptyPages" config:type="boolean">true</config:config-item>
        <config:config-item config:name="UnbreakableNumberings" config:type="boolean">false</config:config-item>
        <config:config-item config:name="UseFormerObjectPositioning" config:type="boolean">false</config:config-item>
        <config:config-item config:name="PrintReversed" config:type="boolean">false</config:config-item>
        <config:config-item config:name="TabsRelativeToIndent" config:type="boolean">true</config:config-item>
        <config:config-item config:name="TableRowKeep" config:type="boolean">false</config:config-item>
        <config:config-item config:name="ConsiderTextWrapOnObjPos" config:type="boolean">false</config:config-item>
        <config:config-item config:name="PrintRightPages" config:type="boolean">true</config:config-item>
        <config:config-item config:name="PrintPaperFromSetup" config:type="boolean">false</config:config-item>
        <config:config-item config:name="AddFrameOffsets" config:type="boolean">false</config:config-item>
        <config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</config:config-item>
        <config:config-item config:name="AddParaSpacingToTableCells" config:type="boolean">true</config:config-item>
        <config:config-item config:name="PrintSingleJobs" config:type="boolean">false</config:config-item>
        <config:config-item config:name="AddExternalLeading" config:type="boolean">true</config:config-item>
        <config:config-item config:name="PrinterIndependentLayout" config:type="string">high-resolution</config:config-item>
        <config:config-item config:name="LinkUpdateMode" config:type="short">1</config:config-item>
        <config:config-item config:name="PrintAnnotationMode" config:type="short">0</config:config-item>
        <config:config-item config:name="UseOldPrinterMetrics" config:type="boolean">false</config:config-item>
        <config:config-item config:name="RedlineProtectionKey" config:type="base64Binary"/>
        <config:config-item config:name="PrinterName" config:type="string"/>
        <config:config-item config:name="CollapseEmptyCellPara" config:type="boolean">true</config:config-item>
        <config:config-item config:name="PrinterSetup" config:type="base64Binary"/>
        <config:config-item config:name="IgnoreFirstLineIndentInNumbering" config:type="boolean">false</config:config-item>
        <config:config-item config:name="InvertBorderSpacing" config:type="boolean">false</config:config-item>
        <config:config-item config:name="PrintPageBackground" config:type="boolean">true</config:config-item>
        <config:config-item config:name="DoNotCaptureDrawObjsOnPage" config:type="boolean">false</config:config-item>
        <config:config-item config:name="TabOverflow" config:type="boolean">true</config:config-item>
        <config:config-item config:name="ApplyUserData" config:type="boolean">true</config:config-item>
        <config:config-item config:name="TabAtLeftIndentForParagraphsInList" config:type="boolean">false</config:config-item>
        <config:config-item config:name="UnxForceZeroExtLeading" config:type="boolean">false</config:config-item>
        <config:config-item config:name="SaveVersionOnClose" config:type="boolean">false</config:config-item>
        <config:config-item config:name="PrintFaxName" config:type="string"/>
        <config:config-item config:name="PrintDrawings" config:type="boolean">true</config:config-item>
        <config:config-item config:name="AddParaTableSpacing" config:type="boolean">true</config:config-item>
        <config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item>
        <config:config-item config:name="PrintGraphics" config:type="boolean">true</config:config-item>
        <config:config-item config:name="FieldAutoUpdate" config:type="boolean">true</config:config-item>
        <config:config-item config:name="AllowPrintJobCancel" config:type="boolean">true</config:config-item>
        <config:config-item config:name="SaveGlobalDocumentLinks" config:type="boolean">false</config:config-item>
        <config:config-item config:name="CurrentDatabaseDataSource" config:type="string"/>
        <config:config-item config:name="UseFormerLineSpacing" config:type="boolean">false</config:config-item>
        <config:config-item config:name="IgnoreTabsAndBlanksForLineCalculation" config:type="boolean">false</config:config-item>
        <config:config-item config:name="CurrentDatabaseCommandType" config:type="int">0</config:config-item>
        <config:config-item config:name="DoNotResetParaAttrsForNumFont" config:type="boolean">false</config:config-item>
        <config:config-item config:name="ClipAsCharacterAnchoredWriterFlyFrames" config:type="boolean">false</config:config-item>
       </config:config-item-set>
     </office:settings>
     
     <office:scripts>
       <office:script script:language="ooo:Basic">
        <ooo:libraries xmlns:ooo="http://openoffice.org/2004/office" xmlns:xlink="http://www.w3.org/1999/xlink">
         <ooo:library-embedded ooo:name="Standard"/>
        </ooo:libraries>
       </office:script>
      </office:scripts>
     
      <office:font-face-decls>
       <style:font-face style:name="Lohit Hindi1" svg:font-family="&apos;Lohit Hindi&apos;"/>
       <style:font-face style:name="Times New Roman"
         svg:font-family="&apos;Times New Roman&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
       <style:font-face style:name="Arial"
         svg:font-family="Arial" style:font-family-generic="swiss" style:font-pitch="variable"/>
       <style:font-face style:name="Lohit Hindi"
         svg:font-family="&apos;Lohit Hindi&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
       <style:font-face style:name="WenQuanYi Micro Hei"
         svg:font-family="&apos;WenQuanYi Micro Hei&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
      </office:font-face-decls>
     
      <office:styles>
       <style:default-style style:family="graphic">
        <style:graphic-properties svg:stroke-color="#808080" draw:fill-color="#cfe7f5"
        fo:wrap-option="no-wrap" draw:shadow-offset-x="0.3cm" draw:shadow-offset-y="0.3cm"
        draw:start-line-spacing-horizontal="0.283cm" draw:start-line-spacing-vertical="0.283cm"
        draw:end-line-spacing-horizontal="0.283cm" draw:end-line-spacing-vertical="0.283cm" style:flow-with-text="false"/>
        <style:paragraph-properties style:text-autospace="ideograph-alpha" style:line-break="strict"
        style:writing-mode="lr-tb" style:font-independent-line-spacing="false">
         <style:tab-stops/>
        </style:paragraph-properties>
        <style:text-properties style:use-window-font-color="true" fo:font-size="12pt" fo:language="fr"
        fo:country="FR" style:letter-kerning="true" style:font-size-asian="10.5pt" style:language-asian="zh"
        style:country-asian="CN" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN"/>
       </style:default-style>
       <style:default-style style:family="paragraph">
        <style:paragraph-properties fo:hyphenation-ladder-count="no-limit" style:text-autospace="ideograph-alpha"
        style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="1.251cm" style:writing-mode="page"/>
        <style:text-properties style:use-window-font-color="true" style:font-name="Times New Roman"
        fo:font-size="12pt" fo:language="fr" fo:country="FR" style:letter-kerning="true"
        style:font-name-asian="WenQuanYi Micro Hei" style:font-size-asian="10.5pt"
        style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Lohit Hindi"
        style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN"
        fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2"/>
       </style:default-style>
       <style:default-style style:family="table">
        <style:table-properties table:border-model="collapsing"/>
       </style:default-style>
       <style:default-style style:family="table-row">
        <style:table-row-properties fo:keep-together="auto"/>
       </style:default-style>
       <style:style style:name="Standard" style:family="paragraph" style:class="text"/>
       <style:style style:name="Heading" style:family="paragraph" style:parent-style-name="Standard"
       style:next-style-name="Text_20_body" style:class="text">
        <style:paragraph-properties fo:margin-top="0.423cm" fo:margin-bottom="0.212cm"
        fo:keep-with-next="always"/>
        <style:text-properties style:font-name="Arial" fo:font-size="14pt" style:font-name-asian="WenQuanYi Micro Hei"
        style:font-size-asian="14pt" style:font-name-complex="Lohit Hindi" style:font-size-complex="14pt"/>
       </style:style>
       <style:style style:name="Text_20_body" style:display-name="Text body" style:family="paragraph"
       style:parent-style-name="Standard" style:class="text">
        <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.212cm"/>
       </style:style>
       <style:style style:name="List" style:family="paragraph" style:parent-style-name="Text_20_body"
       style:class="list">
        <style:text-properties style:font-size-asian="12pt" style:font-name-complex="Lohit Hindi1"/>
       </style:style>
       <style:style style:name="Caption" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">
        <style:paragraph-properties fo:margin-top="0.212cm" fo:margin-bottom="0.212cm"
        text:number-lines="false" text:line-number="0"/>
        <style:text-properties fo:font-size="12pt" fo:font-style="italic" style:font-size-asian="12pt"
        style:font-style-asian="italic" style:font-name-complex="Lohit Hindi1"
        style:font-size-complex="12pt" style:font-style-complex="italic"/>
       </style:style>
       <style:style style:name="Index" style:family="paragraph" style:parent-style-name="Standard"
       style:class="index">
        <style:paragraph-properties text:number-lines="false" text:line-number="0"/>
        <style:text-properties style:font-size-asian="12pt" style:font-name-complex="Lohit Hindi1"/>
       </style:style>
       <style:style style:name="Strong_20_Emphasis" style:display-name="Strong Emphasis" style:family="text">
        <style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/>
       </style:style>
       <text:outline-style style:name="Outline">
        <text:outline-level-style text:level="1" style:num-format="">
         <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
          <style:list-level-label-alignment text:label-followed-by="listtab"
          text:list-tab-stop-position="0.762cm" fo:text-indent="-0.762cm" fo:margin-left="0.762cm"/>
         </style:list-level-properties>
        </text:outline-level-style>
        <text:outline-level-style text:level="2" style:num-format="">
         <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
          <style:list-level-label-alignment text:label-followed-by="listtab"
          text:list-tab-stop-position="1.016cm" fo:text-indent="-1.016cm" fo:margin-left="1.016cm"/>
         </style:list-level-properties>
        </text:outline-level-style>
        <text:outline-level-style text:level="3" style:num-format="">
         <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
          <style:list-level-label-alignment text:label-followed-by="listtab"
          text:list-tab-stop-position="1.27cm" fo:text-indent="-1.27cm" fo:margin-left="1.27cm"/>
         </style:list-level-properties>
        </text:outline-level-style>
        <text:outline-level-style text:level="4" style:num-format="">
         <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
          <style:list-level-label-alignment text:label-followed-by="listtab"
          text:list-tab-stop-position="1.524cm" fo:text-indent="-1.524cm" fo:margin-left="1.524cm"/>
         </style:list-level-properties>
        </text:outline-level-style>
        <text:outline-level-style text:level="5" style:num-format="">
         <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
          <style:list-level-label-alignment text:label-followed-by="listtab"
          text:list-tab-stop-position="1.778cm" fo:text-indent="-1.778cm" fo:margin-left="1.778cm"/>
         </style:list-level-properties>
        </text:outline-level-style>
        <text:outline-level-style text:level="6" style:num-format="">
         <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
          <style:list-level-label-alignment text:label-followed-by="listtab"
          text:list-tab-stop-position="2.032cm" fo:text-indent="-2.032cm" fo:margin-left="2.032cm"/>
         </style:list-level-properties>
        </text:outline-level-style>
        <text:outline-level-style text:level="7" style:num-format="">
         <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
          <style:list-level-label-alignment text:label-followed-by="listtab"
          text:list-tab-stop-position="2.286cm" fo:text-indent="-2.286cm" fo:margin-left="2.286cm"/>
         </style:list-level-properties>
        </text:outline-level-style>
        <text:outline-level-style text:level="8" style:num-format="">
         <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
          <style:list-level-label-alignment text:label-followed-by="listtab"
          text:list-tab-stop-position="2.54cm" fo:text-indent="-2.54cm" fo:margin-left="2.54cm"/>
         </style:list-level-properties>
        </text:outline-level-style>
        <text:outline-level-style text:level="9" style:num-format="">
         <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
          <style:list-level-label-alignment text:label-followed-by="listtab"
          text:list-tab-stop-position="2.794cm" fo:text-indent="-2.794cm" fo:margin-left="2.794cm"/>
         </style:list-level-properties>
        </text:outline-level-style>
        <text:outline-level-style text:level="10" style:num-format="">
         <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
          <style:list-level-label-alignment text:label-followed-by="listtab"
          text:list-tab-stop-position="3.048cm" fo:text-indent="-3.048cm" fo:margin-left="3.048cm"/>
         </style:list-level-properties>
        </text:outline-level-style>
       </text:outline-style>
       <text:notes-configuration text:note-class="footnote" style:num-format="1"
       text:start-value="0" text:footnotes-position="page" text:start-numbering-at="document"/>
       <text:notes-configuration text:note-class="endnote" style:num-format="i"
       text:start-value="0"/>
       <text:linenumbering-configuration text:number-lines="false"
       text:offset="0.499cm" style:num-format="1" text:number-position="left" text:increment="5"/>
      </office:styles>
      <office:automatic-styles>
       <style:style style:name="T1" style:family="text">
        <style:text-properties fo:font-weight="normal"
        style:font-weight-asian="normal" style:font-weight-complex="normal"/>
       </style:style>
       <style:style style:name="T2" style:family="text">
        <style:text-properties fo:font-weight="bold"
        style:font-weight-asian="bold" style:font-weight-complex="bold"/>
       </style:style>
       <style:style style:name="T3" style:family="text">
        <style:text-properties fo:color="#0000ff" fo:font-weight="normal"
        style:font-weight-asian="normal" style:font-weight-complex="normal"/>
       </style:style>
       <style:style style:name="T4" style:family="text">
        <style:text-properties fo:color="#0000ff" fo:font-weight="bold"
        style:font-weight-asian="bold" style:font-weight-complex="bold"/>
       </style:style>
       <style:page-layout style:name="pm1">
        <style:page-layout-properties fo:page-width="21.001cm" fo:page-height="29.7cm"
        style:num-format="1" style:print-orientation="portrait" fo:margin="2cm" fo:margin-top="2cm"
        fo:margin-bottom="2cm" fo:margin-left="2cm" fo:margin-right="2cm" style:writing-mode="lr-tb"
        style:footnote-max-height="0cm">
         <style:footnote-sep style:width="0.018cm" style:distance-before-sep="0.101cm"
         style:distance-after-sep="0.101cm" style:line-style="solid" style:adjustment="left"
         style:rel-width="25%" style:color="#000000"/>
        </style:page-layout-properties>
        <style:header-style/>
        <style:footer-style/>
       </style:page-layout>
      </office:automatic-styles>
      <office:master-styles>
       <style:master-page style:name="Standard" style:page-layout-name="pm1"/>
      </office:master-styles>
     
      <office:body>
       <office:text>
        <text:sequence-decls>
         <text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>
         <text:sequence-decl text:display-outline-level="0" text:name="Table"/>
         <text:sequence-decl text:display-outline-level="0" text:name="Text"/>
         <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
        </text:sequence-decls>
        <text:p text:style-name="Standard"><text:span text:style-name="Strong_20_Emphasis">
        <text:span text:style-name="T1">Bon </text:span></text:span>
        <text:span text:style-name="Strong_20_Emphasis"><text:span text:style-name="T2">courage</text:span></text:span>
        <text:span text:style-name="Strong_20_Emphasis"><text:span text:style-name="T1"> à </text:span></text:span>
        <text:span text:style-name="Strong_20_Emphasis"><text:span text:style-name="T3">tous</text:span></text:span>
        <text:span text:style-name="Strong_20_Emphasis"><text:span text:style-name="T1"> et à </text:span></text:span>
        <text:span text:style-name="Strong_20_Emphasis"><text:span text:style-name="T4">toutes</text:span></text:span>
        </text:p>
     
       </office:text>
      </office:body>
     </office:document>
     

Le format CSV est un format texte délimité dont le séparateur par défaut est la virgule en mode EN et le point-virgule en modeFR. Le wiki anglais et le wiki français ne fournissent pas exactement les mêmes informations sur ce format :


     $gh>cat tableur_data.csv
     
     "Iden";"Longueur"
     "1906384B";110
     "1YYCA";174
     "A2XG55";33
     

Là encore, les formats ODS et XLSX correspondent à des archives de fichiers XML :


     @ghchu~/public_html/Webrd|(~gH) > unzip -v tableur_data.ods
     
     Archive:  tableur_data.ods
      Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
     --------  ------  ------- ---- ---------- ----- --------  ----
           46  Stored       46   0% 2012-08-11 21:30 8a396c85  mimetype
         4586  Defl:N     1055  77% 2012-08-11 21:30 709917f1  content.xml
         6515  Defl:N     1495  77% 2012-08-11 21:30 5930af5f  styles.xml
          703  Stored      703   0% 2012-08-11 21:30 0ed35f21  meta.xml
         3139  Defl:N     2535  19% 2012-08-11 21:30 dc135285  Thumbnails/thumbnail.png
            0  Defl:N        2   0% 2012-08-11 21:30 00000000  Configurations2/accelerator/current.xml
            0  Stored        0   0% 2012-08-11 21:30 00000000  Configurations2/progressbar/
            0  Stored        0   0% 2012-08-11 21:30 00000000  Configurations2/floater/
            0  Stored        0   0% 2012-08-11 21:30 00000000  Configurations2/popupmenu/
            0  Stored        0   0% 2012-08-11 21:30 00000000  Configurations2/menubar/
            0  Stored        0   0% 2012-08-11 21:30 00000000  Configurations2/toolbar/
            0  Stored        0   0% 2012-08-11 21:30 00000000  Configurations2/images/Bitmaps/
            0  Stored        0   0% 2012-08-11 21:30 00000000  Configurations2/statusbar/
         7231  Defl:N      945  87% 2012-08-11 21:30 9393bb63  settings.xml
         1896  Defl:N      330  83% 2012-08-11 21:30 ff80d544  META-INF/manifest.xml
     --------          -------  ---                            -------
        24116             7111  71%                            15 files
     
     @ghchu~/public_html/Webrd|(~gH) > unzip -v tableur_data.xlsx
     
     Archive:  tableur_data.xlsx
      Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
     --------  ------  ------- ---- ---------- ----- --------  ----
          571  Defl:N      224  61% 2012-08-11 21:29 b782aa66  _rels/.rels
          392  Defl:N      223  43% 2012-08-11 21:29 aae67dae  docProps/core.xml
          358  Defl:N      218  39% 2012-08-11 21:29 dc515681  docProps/app.xml
          549  Defl:N      210  62% 2012-08-11 21:29 7af9f04f  xl/_rels/workbook.xml.rels
         2610  Defl:N      970  63% 2012-08-11 21:29 54a219b2  xl/worksheets/sheet1.xml
         4425  Defl:N      671  85% 2012-08-11 21:29 9e9cee72  xl/styles.xml
          718  Defl:N      411  43% 2012-08-11 21:29 e0a08d5d  xl/workbook.xml
          270  Defl:N      186  31% 2012-08-11 21:29 d3e2279e  xl/sharedStrings.xml
         1111  Defl:N      305  73% 2012-08-11 21:29 44d373f5  [Content_Types].xml
     --------          -------  ---                            -------
        11004             3418  69%                            9 files
     

Pour Open Office, le «vrai» fichier est content.xml ; pour Microsoft Office, le «vrai» fichier utilise sheet1.xml et sharedStrings.xml.

 

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

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.

 

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

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

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.

 

9. Dessins et rendus XML

On structure un dessin 2D élémentaire selon les règles suivantes. Un dessin est un cercle, un rectangle ou un triangle. Un cercle est défini par un centre et un rayon, un rectangle par son csg (coin supérieur gauche), une longueur et une largeur, un triangle par trois points. Chaque élément graphique peut avoir une couleur parmi les mots prédéfinis bleu, rouge, jaune. Ecrire un fichier dessin.xml qui dans un viewport bleu de 500 pixels de large et 300 de haut, met un "soleil" jaune de rayon 15 pixels en (450,50), une plage rectangulaire verte qui fait toute la largeur et qui fait 100 pixels de haut. Pour les plus fort(e)s, rajouter une petite étoile de mer rouge en bas à gauche à l'aide de trois triangles bien choisis. A défaut, on placera juste un triangle plein et en rouge. On pourra s'inspirer du dessin ci-dessous et de la syntaxe SVG.

                              non su

Ecrire ensuite la "vraie" version en SVG de ce dessin.

Lister tous les éléments XML distincts utilisés dans le logo du renard ci-dessous, puis compter tous les éléments avec leurs attributs.

                              non su

Expliquer comment on obtient un rendu "propre et intéressant" des horaires de CELCAT par exemple pour les horaires de ce cours.

                              non su

Expliquer comment on obtient un affichage dynamique de données hiérarchiques avec Krona.

                              non su

 

Solution :  

Voici un fichier XML possible pour le dessin avec une syntaxe en français adaptée de SVG, nommé dessin.xml


     <?xml version="1.0" encoding="ISO-8859-1" ?>
     <dessins largeur="500px" hauteur="300px">
     <dessin>
     
       <!-- tout en bleu ciel -->
       <rectangle  xcsg="0"    ycsg="0"   largeur="500" hauteur="300"   couleur="bleu-ciel"   />
     
       <!-- le soleil en jaune -->
       <cercle xcentre="450" ycentre="50"  rayon="15"  couleur="jaune" />
     
       <!-- la plage en vert -->
       <rectangle xcsg="0"    ycsg="200"  largeur="500" hauteur="100" couleur="vert"   />
     
       <!-- un triangle rouge -->
       <triangle couleur="rouge" xpoint1="50" ypoint1="250" xpoint2="75" ypoint2="225" xpoint3="100" ypoint3="250" />
     
     </dessin>
     </dessins>
     

La "vraie" version dont un rendu est dans dessin1.svg est la suivante


     <?xml version="1.0" encoding="ISO-8859-1" ?>
     <svg xmlns="http://www.w3.org/2000/svg" width="500px" height="300px">
     <g>
     
       <!-- tout en bleu ciel -->
       <rect    x="0"    y="0"   width="500" height="300"   fill="cyan"   />
     
       <!-- le soleil en jaune -->
       <circle cx="450" cy="50"  r="15"                     fill="yellow" />
     
       <!-- la plage en vert -->
       <rect    x="0"    y="200"   width="500" height="100" fill="green"   />
     
       <!-- un triangle rouge -->
       <path fill="red" d="M 50,250 L 75,225 L 100, 250 z" />
     
     </g>
     </svg>
     

Et pour le dessin avec l'étoile dessin2.svg on peut utiliser


     <?xml version="1.0" encoding="ISO-8859-1" ?>
     <!DOCTYPE svg SYSTEM "Dtd/svg.dtd">
     <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="500px" height="300px">
     <g>
     
       <!-- tout en bleu ciel -->
       <rect    x="0"    y="0"   width="500" height="300"   fill="cyan"   />
     
       <!-- le soleil en jaune -->
       <circle cx="450" cy="50"  r="15"                     fill="yellow" />
     
       <!-- la plage en vert -->
       <rect    x="0"    y="200"   width="500" height="100" fill="green"   />
     
       <!-- l'étoile de mer en rouge avec 2 triangles rouges et un triangle vert -->
     
       <path fill="red"   d="M 050,250 L 080,265 L 110,250 z" />
       <path fill="red"   d="M 065,285 L 080,225 L 095,285 z" />
       <path fill="green" d="M 065,285 L 080,265 L 095,285 z" />
     
     </g>
     </svg>
     
Rendu SVG (si le browser le permet)
Rendu PNG (copie d'écran) dessin1 dessin2

Il y a en fait assez peu d'éléments utilisés pour le renard. Ainsi la commande xmlstarlet el -u firefox.svg renvoie une liste de 26 éléments distincts dans l'arbre, pour 348 éléments en tout. Si on retire les éléments égaux emboités comme g et g/g, il ne reste que 17 "vrais" éléments utilisés :


     # éléments issus de xmlstarlet el -u firefox.svg             # éléments uniques
     
     0001 svg                                                     0001 clipPath
     0002 svg/desc                                                0002 defs
     0003 svg/g                                                   0003 desc
     0004 svg/g/filter                                            0004 ellipse
     0005 svg/g/filter/feGaussianBlur                             0005 feGaussianBlur
     0006 svg/g/filter/feMerge                                    0006 feMerge
     0007 svg/g/filter/feMerge/feMergeNode                        0007 feMergeNode
     0008 svg/g/filter/feOffset                                   0008 feOffset
     0009 svg/g/g                                                 0009 filter
     0010 svg/g/g/ellipse                                         0010 g
     0011 svg/g/g/g                                               0011 linearGradient
     0012 svg/g/g/g/clipPath                                      0012 path
     0013 svg/g/g/g/clipPath/use                                  0013 radialGradient
     0014 svg/g/g/g/defs                                          0014 stop
     0015 svg/g/g/g/defs/ellipse                                  0015 svg
     0016 svg/g/g/g/linearGradient                                0016 title
     0017 svg/g/g/g/linearGradient/stop                           0017 use
     0018 svg/g/g/g/path
     0019 svg/g/g/g/radialGradient
     0020 svg/g/g/g/radialGradient/stop
     0021 svg/g/g/linearGradient
     0022 svg/g/g/linearGradient/stop
     0023 svg/g/g/path
     0024 svg/g/g/radialGradient
     0025 svg/g/g/radialGradient/stop
     0026 svg/title
     
     

Pour connaitre les attributs utilisés et pour compter chacun des éléments, il faut programmer le comptage des balises d'ouverture et de fermeture, ce que fait notre programme eltattres.php dont l'interface de départ est ici. On pourra cliquer sur le lien elementsRenard pour le vérifier et lire les comptages.

L'affichage fourni par CELCAT est un simple rendu de XML avec CSS.

Pour krona, c'est un peu plus compliqué. Il y a du code Javascript krona.js qui lit la partie XML de la page HTML et qui produit le graphique interactif dans un élément canvas. L'export, lui, est un "snapshot" généré pour SVG.

 

10. Lecture de fichiers XML sur Internet et logiciel R

Parmi les logiciels vus en ligne de commande, lesquel(s) savent lire des fichiers sur internet via une URL ?

Après avoir parcouru l'introduction non élémentaire au logiciel R, est-ce que le logiciel R sait lire des fichiers sur internet via une URL ? Et des fichiers XML ?

Comment faire avec R pour récupérer le contenu d'un tableau dans une page Web ?

Solution :  

rxp, xmllint, xmlstarlet et xsltproc savent tous lire des fichiers sur internet via une URL.

La lecture des fichiers via une URL est une simple formalité en R car elle est native.

A l'aide du package nommé XML, la lecture de fichiers XML de pages Web est très facile. Consulter la solution de l'exercice 5 dans l'introduction non élémentaire au logiciel R pour voir cela par l'exemple.

Pour vraiment plus de détails, on pourra lire les 650 pages de l'excellent ouvrage XML and Web Technologies for Data Sciences with R de D. Nolan et D. Temple Lang :

lang.jpg

Pour une vision précise des rapports entre R et les technologies Web, le mieux est sans doute de lire la «Task View» nommée WebTechnologies.html et sa petite soeur sur l'opendata (sur Github).

Remarque : il est possible d'apprendre à utiliser R (et Python) sans installation logicielle via DataJoy.

 

11. Questions diverses

Faut-il indenter les fichiers ?

Quel navigateur Web est le plus adapté à l'affichage de fichiers XML ?

Quels éditeurs peut-on utiliser pour XML, sous Linux, sous Windows ?

Qu'est-ce qu'une structure mixte ? Pourquoi faut-il éviter les structures mixtes ?

Une page Web est-elle un document XML ?

Une fichier RDF est-il un document XML ? Et une image SVG ?

Pourquoi s'intéresser plus à XML 1.0 qu'à XML 1.1 ? Quelles sont les différences ?

Est-ce que HTML5 est un langage basé sur XML ?

Solution :  

Il n'est pas conseillé d'indenter, dans la mesure où les espaces et les retours-charriots, les tabulations... désignés par l'appellation white spaces sont souvent mal gérés ou gérés différemment suivant les logiciels, et en particulier les navigateurs, certains créant des noeuds-texte pour contenir ces espaces et assimilés. On pourra s'en convaincre en ouvrant avec divers navigateurs les deux fichiers whitespace1 et whitespace2 qui ne différent que par des espaces et des retours-charriots. Si on indente, par contre, il faut toujours indenter de la même façon. Normaliser les espaces, les tabulations, les retours à la ligne, voire stocker les attributs par ordre alphabétique revient à utiliser une forme canonique pour les fichiers XML.

Un fichier de description de ressources RDF n'est pas forcément un un fichier XML, car RDF et le web sémantique utilisent de nombreux formats, parfois XML et parfois non XML comme les formats turtle et Notation3. On écrit RDF/XML lorsqu'on veut indiquer que les ressources sont écrites en format XML. Une image SVG est aussi un fichier XML mais qui est interprété dès son ouverture pour fournir un rendu graphique. Ainsi, ouvrir exemple.rdf et exemple.svg avec un navigateur ne produit pas les mêmes effets : le fichier RDF est affiché comme un fichier XML classique, le fichier SVG est dessiné à l'écran.

Les notions vues et les explications fournies en cours (volontairement non reproduites ici) permettent de répondre aux questions liées à XML 1.1 et HTML5.

 

Archive des données, programmes et scripts.

 

Code-source php de cette page ; code javascript utilisé. Retour à la page principale du cours.

 

 

retour gH    Retour à la page principale de   (gH)