# Infonum XML - Support de cours ## Exemples introductifs [Exemple OpenDocument](https://fr.wikipedia.org/wiki/OpenDocument) (formats : ODT, DOCX…). [Exemple OpenStreetMap](https://www.openstreetmap.org/node/656500681). Dans la barre latérale gauche tout en bas, cliquez sur "Télécharger en XML" ([lien direct](https://www.openstreetmap.org/api/0.6/node/656500681)). Affichez le code source. [Exemple SVG](https://www.w3.org/Icons/WWW/w3c_home_nb-v.svg). Affichez le code source. ## Définitions - [W3C](https://www.w3.org/XML/) - [Wikipédia](https://fr.m.wikipedia.org/wiki/Extensible_Markup_Language) ## Notions de base Séparation fond/forme : HTML vs. XML ```html <p>Holly Golightly</p> <p>169 East 71st St.</p> <p>Manhattan, New York City</p> <p><span style="font-family: monospace">202-555-0137</span></p> ``` ```xml <address> <personname> <firstname>Holly</firstname> <surname>Golightly</surname> </personname> <street> <streetnumber>169</streetnumber> <streetname>East 71st St.</streetname> </street> <borough>Manhattan</borough> <city>New York City</city> <phonenumber>202-555-0137</phonenumber> </address> ``` Bien formé ≠ valide : - Un document est **bien formé** s'il respecte les règles syntaxiques de XML (orthographe). - Un document est **valide** par rapport à un modèle (grammaire). L'extensibilité (vocabulaire + grammaire) se fait via les modèles (DTD et schémas). Exemple : ```dtd <!-- Modèle de document (DTD) --> <!DOCTYPE book [ <!ELEMENT book (#PCDATA | em | cite)*> <!ELEMENT em (#PCDATA)> <!ELEMENT cite (#PCDATA)> ]> ``` ```xml <!-- Document XML --> <book> Du <em>texte</em> et une <cite>citation</cite>. </book> ``` ## Anatomie d'un fichier XML ```xml <?xml version="1.0" encoding="utf-8"?> <!-- Time-stamp: 12 November 2019 at 18:18:55 CET --> <!DOCTYPE bibliography SYSTEM "bibliography.dtd" > <bibliography> <book key="Michard01" lang="fr"> <title>XML langage et applications</title> <author>Alain Michard</author> <year>2001</year> <publisher>Eyrolles</publisher> <isbn>2-212-09206-7</isbn> <url>http://www.editions-eyrolles/livres/michard/</url> </book> <book key="Zeldman03" lang="en"> <title>Designing with web standards</title> <author>Jeffrey Zeldman</author> <year>2003</year> <publisher>New Riders</publisher> <isbn>0-7357-1201-8</isbn> </book> </bibliography> ``` 1. En-tête XML avec la version 1.0 et l'encodage UTF-8 des caractères. 2. Commentaire délimité par les chaînes de caractères `<!--` et `-->`. 3. Déclaration de DTD externe dans le fichier `bibliography.dtd`. 4. Balise ouvrante de l'élément racine `bibliography`. 5. Balise ouvrante de l'élément book avec deux attributs de noms `key` et `lang` et de valeurs `Michard01` et `fr`. 20. Balise fermante de l'élément racine `bibliography`. ### Prologue Le prologue est en début de document. Il contient l'en-tête et les déclarations de type de document. La seule information requise dans le prologue est la version XML, toutes les autres sont facultatives. En-tête (version, encodage, autonomie) : ```xml <?xml version="…" encoding="…" standalone="…"?> ``` ```xml <?xml version="1.0"?> <?xml version='1.0' encoding='UTF-8'?> <?xml version="1.1" encoding="UTF-8" standalone="no"?> ``` Déclaration de type de document : ```xml <!DOCTYPE … > ``` Encodage : privilégiez l'UTF-8. Contrairement au Latin-1, il encode l'intégralité des [caractères Unicode](https://unicode-table.com/en/) ### Éléments Un élément est formé d'une balise ouvrante, d'un contenu et de la balise fermante correspondante. Les caractères autorisés dans les identificateurs sont tous les caractères alphanumériques, c'est-à-dire les lettres minuscules [a-z], majuscules [A-Z] et les chiffres [0-9] ainsi que le tiret '-', le point '.', les deux points ':' et le tiret souligné '\_'. Un jeton est une suite quelconque de ces caractères. Un nom XML est un jeton qui, en outre, commence par une lettre [a-zA-Z], le caractère ':' ou le caractère '\_'. Les deux caractères '-' et '.' ainsi que les chiffres ne peuvent pas apparaître au début des noms. Les caractères spéciaux ne peuvent pas être inclus directement dans le contenu d'un document. Ils peuvent être inclus par l'intermédiaire des entités prédéfinies et des sections littérales. Entité | Caractère :------- | :-------: `&lt;` | < `&gt;` | > `&amp;` | & `&apos;` | ' `&quot;` | " Sections littérales : ```xml <![CDATA[Contenu avec des caractères spéciaux <, > et & ]]> ``` On parle d'élément vide lorsque le contenu de l'élément est vide : ```xml <name></name> ``` Peut aussi s'écrire : ```xml <name/> ``` Notion d'imbrication et élément racine : ![Règle d'imbrication](https://www.irif.fr/~carton/Enseignement/XML/Cours/Syntax/tags.png) ```xml <parent> <sibling1> … </sibling1> <sibling2> … </sibling2> <self> <child1> … <desc1></desc1> … <desc2></desc2> … </child1> <child2> … </child2> <child3> … <desc3><desc4> … </desc4></desc3> … </child3> </self> <sibling3> … </sibling3> </parent> ``` ### Attributs Les balises ouvrantes peuvent contenir des attributs associés à des valeurs. ```xml <tag attribute="value"> … </tag> <tag attribute1="value1" attribute2="value2"> … </tag> ``` Exemples : ```xml <body background='yellow'> … </body> <xsd:element name="bibliography" type="Bibliography"> … </xsd:element> <a href="#{$node/@idref}"> … </a> <hr style="color:red; height:15px; width:350px;" /> <xsd:attribute name="key" type="xsd:NMTOKEN" use="required"/> ``` Distinction entre donnée et métadonnée : ```xml <date format="ISO-8601">2009-01-08</date> ``` En pratique, les usages varient : ```xml <personname id="001"> <firstname>Gaston</firstname> <surname>Lagaffe</surname> </personname> ``` ```xml <personname id="001" firstname="Gaston" surname="Lagaffe"/> ``` Attributs particuliers : `lang`, `space`, `base` et `id`. Exemple : ```xml <?xml version="1.0" encoding="UTF-8" standalone="no"?> <book xml:lang="fr"> <title>Livre en Français</title> <chapter> <title>Chapitre en Français</title> <p>Paragraphe en Français</p> <p xml:lang="en">Paragraph in English</p> </chapter> <chapter xml:lang="en"> <title>Chapter in English</title> <p xml:lang="fr">Paragraphe en Français</p> <p>Paragraph in English</p> </chapter> </book> ``` ### Commentaires Les commentaires peuvent être présents dans le prologue et en particulier dans la DTD. Ils peuvent être placés dans le contenu de n'importe quel élément et après l'élément racine. En revanche, ils ne peuvent jamais apparaître à l'intérieur d'une balise ouvrante ou fermante, et ils ne peuvent pas être imbriqués entre eux. ```xml <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Commentaire dans le prologue avant la DTD --> <!DOCTYPE simple [ <!-- Commentaire dans la DTD --> <!ELEMENT simple (#PCDATA) > ]> <!-- Commentaire entre le prologue et le corps du document --> <simple> <!-- Commentaire au début du contenu de l'élément simple --> Un exemple simplissime <!-- Commentaire à la fin du contenu de l'élément simple --> </simple> <!-- Commentaire après le corps du document --> ``` ## Les *Uniform Resource Identifiers* (URI) *Uniform Resource Locator* (URL) : ``` répertoire fichier ┌──┴─┐┌──────┴─────┐ https://john.doe@www.example.com:123/forum/questions.html └─┬─┘ └───────┬────────────────────┘└──────┬────────────┘ protocole adresse chemin d'accès ``` *Uniform Resource Name* (URN) : ``` urn:isbn:978-2-7117-2077-4 └┬┘ └──────┬─────────────┘ protocole chemin d'accès ``` ### Chemins d'accès ![](http://desktop.arcgis.com/fr/arcmap/10.3/tools/supplement/GUID-787809E8-335F-458A-A776-5079B2847765-web.gif) Dans l'arborescence ci-dessus, si on se situe dans le dossier `Landuse` alors les chemins s'écrivent comme ceci : ``` .. (D:\Data\Shapefiles) ..\.. (D:\Data) ..\..\Final (D:\Data\Final) . (D:\Data\Shapefiles\Landuse - the current directory) .\..\Soils (D:\Data\Final\Soils) ..\..\.\Final\..\Shapefiles\.\Landuse (D:\Data\Shapefiles\Landuse) ``` ## CSS Les feuilles de style se déclarent dans le prologue. Attention à l'écriture du chemin ! ```xml <?xml-stylesheet type="text/css" href="styles.css" ?> ``` ```css /* Contenu du fichier "styles.css" */ element { display: block; text-align: left; } … ``` ### Outils CSS utiles `display` : [le type d'affichage](https://developer.mozilla.org/fr/docs/Web/CSS/display) `em` : [les unités proportionnelles](https://developer.mozilla.org/fr/docs/Learn/CSS/Building_blocks/Values_and_units) `:first-child`, `::before` : [les sélecteurs, pseudo-éléments et pseudo-classes](https://developer.mozilla.org/fr/docs/Glossaire/S%C3%A9lecteur_CSS) ## Éditer efficacement Exemple : les raccourcis clavier Brackets [PC](https://lisacatalano.github.io/brackets_course/pc.html) et [Mac](https://lisacatalano.github.io/brackets_course/mac.html). ## Modèles Les modèles servent à codifier l'écriture des documents XML au-delà de la simple syntaxe. Il permettent l'interopérabilité. Rappel : un document est dit **valide** s'il est conforme à un modèle. Il existe deux façons d'écrire des modèles pour XML : - DTD : *document type definition*. Mécanisme hérité du SGML, syntaxe spécifique, précision limitée. - Schémas : s'écrivent en XML (pas de syntaxe spécifique), précision élevée, utilisent des [espaces de noms](https://fr.wikipedia.org/wiki/Espace_de_noms_XML). Exemple de DTD : ```dtd <!-- Fichier "fichecontact.dtd" --> <!ELEMENT contact (prénom, nom, adresse+, téléphone+, email*)> <!ELEMENT prénom (#PCDATA)> <!ELEMENT nom (#PCDATA)> <!ELEMENT adresse (#PCDATA | numéro_rue | nom_rue | code_postal | ville)*> <!ATTLIST adresse note CDATA #IMPLIED> <!ELEMENT numéro_rue (#PCDATA)> <!ELEMENT nom_rue (#PCDATA)> <!ELEMENT code_postal (#PCDATA)> <!ELEMENT ville (#PCDATA)> <!ELEMENT téléphone (#PCDATA)> <!ATTLIST téléphone type (fixe|mobile) #REQUIRED> <!ELEMENT email (#PCDATA)> ``` ```xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE contact SYSTEM "fichecontact.dtd"> <contact> <prénom></prénom> <nom></nom> <adresse> <numéro_rue></numéro_rue> <nom_rue></nom_rue> <code_postal></code_postal>, <ville></ville> </adresse> <adresse note="Résidence secondaire"> <numéro_rue></numéro_rue> <nom_rue></nom_rue> <code_postal></code_postal>, <ville></ville> </adresse> <téléphone type="fixe"></téléphone> <email></email> </contact> Exemple de schéma : ```xml <!-- Fichier "mutants.xsd" --> <?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="mutants"> <xsd:complexType> <xsd:sequence> <xsd:element name="mutant" minOccurs="1" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name="nom" type="xsd:string"> <xsd:element name="age" type="xsd:integer"> <xsd:element name="pouvoir" type="xsd:string"> </xsd:sequence> </xsd:complexType> </xsd:sequence> <xsd:attribute name="id" type="xsd:ID" use="required"> </xsd:complexType> </xsd:element> </xsd:schema> ``` ```xml <?xml version="1.0" encoding="UTF-8"?> <mutants xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://site.org/adresse mutants.xsd"> <mutant id="x1"> <nom>Pr Xavier</name> <age>63</age> <pouvoir>télépathie</power> </mutant> … </mutants> ``` ## XML dans l'écosystème des données Parallèle avec l'infrastructure routière, ferroviaire et télécom : présent partout, souvent invisible, concerné par des problématiques de maintenance ou d'évolution technologique. Domaines dans lesquels XML est ubiquitaire et qui sont liés à l'information-communication : - Documentation d'entreprise. Ex : [formats standards édités par le consortium OASIS](https://www.oasis-open.org/standards) (comme OpenDocument). - Bibliothèques . Ex : schémas [MODS](https://fr.wikipedia.org/wiki/Metadata_Object_Description_Schema) et [METS](https://fr.wikipedia.org/wiki/Metadata_Encoding_and_Transmission_Standard). - Archives. Ex : [XML-EAD](https://fr.wikipedia.org/wiki/Description_archivistique_encod%C3%A9e). - Édition numérique Ex : XHTML, [EPUB](https://fr.wikipedia.org/wiki/EPUB_(format)), [XML-TEI](https://fr.wikipedia.org/wiki/Text_Encoding_Initiative). XML n'est pas le seul format de sérialisation (encodage sous forme réduite) de données. Il en existe d'autres qui ont des atouts et des spécificités différentes : - [CSV](https://fr.wikipedia.org/wiki/Comma-separated_values) : extrêmement compact ; permet d'exprimer des données tabulaires (tableaux, tableurs). - [JSON](https://fr.wikipedia.org/wiki/JavaScript_Object_Notation) : format semblable à XML (polyvalent, verbeux) ; très adapté au Web dont il est issu à l'origine (Javascript). - [YAML](https://fr.wikipedia.org/wiki/YAML) : optimisé pour les humains car facile à lire/écrire ; souvent utilisé pour exprimer des métadonnées ou des fichiers de configuration ; la hiérarchie repose sur l'indentation.