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
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
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 : masquer la 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 là (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 : masquer la 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 : masquer la 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 : masquer la 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 : masquer la 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 33Solution : masquer la 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 filesLes «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="'Lohit Hindi'"/> <style:font-face style:name="Times New Roman" svg:font-family="'Times New Roman'" 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="'Lohit Hindi'" style:font-family-generic="system" style:font-pitch="variable"/><style:font-face style:name="WenQuanYi Micro Hei" svg:font-family="'WenQuanYi Micro Hei'" 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="'Lohit Hindi'"/> <style:font-face style:name="Times New Roman" svg:font-family="'Times New Roman'" 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="'Lohit Hindi'" style:font-family-generic="system" style:font-pitch="variable"/> <style:font-face style:name="WenQuanYi Micro Hei" svg:font-family="'WenQuanYi Micro Hei'" 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";33Là 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 filesPour 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 : masquer la 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 là.
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 AEITIPVTFEARAQIGGPEAGKSEQSGAKOn 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 : masquer la 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.
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.
Expliquer comment on obtient un rendu "propre et intéressant" des horaires de CELCAT par exemple pour les horaires de ce cours.
Expliquer comment on obtient un affichage dynamique de données hiérarchiques avec Krona.
Solution : masquer la 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) 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/titlePour 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 : masquer la 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 :
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 : masquer la 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 à la page principale de (gH)