INaLCO - M2 Traductique
Introduction à XML, cours n°1

Jean-François Perrot - avec Firefox !

Généralités sur XML

  1. I. Systèmes de parenthèses et structures arborescentes
    1. Parenthèses et mouvements de pile
    2. Mouvements de pile et parcours d'arbres
    3. Systèmes à plusieurs types de parenthèses : crochets, accolades, chevrons...
    4. Les balises XML sont des parenthèses nommées ...
    5. Visualisation d'un arbre dans un navigateur

  2. II. XML : mettre du contenu dans un arbre
    1. XML offre trois moyens pour ajouter de l'information dans une structure arborescente.
      1. En nommant les balises (parenthèses) :
      2. En ajoutant des attributs aux balises (ouvrantes) :
      3. En ajoutant du texte entre les balises :
    2. Question fondamentale : choix entre attributs et sommets-fils
    3. Détails de syntaxe XML : en-tête, feuilles, commentaires et codage des caractères

  3. III. Espaces de noms (Namespaces)
    1. Problème de l'ambiguïté du vocabulaire
    2. Désigner un domaine nominal
    3. Nom local et nom complet
    4. Exemple
    5. Remarques importantes

  4. IV. Exemples de dialectes XML
    1. XHTML : HTML-4 régularisé en XML
    2. Les flux RSS



I. Systèmes de parenthèses et structures arborescentes

Rappel sur la notion d'arbre en informatique (différente de celle de la théorie des graphes).
Souvent utilisée pour exprimer la structure d'une entité quelconque.

Arbre

Les machines savent parfaitement traiter des arbres
mais les hommes ont besoin de représenter les mêmes arbres par des textes (très longues chaînes de caractères).

Les arbres sont des structures à deux dimensions (la descendance parent-enfant [verticale] et l'ordre entre les enfants [horizontale]).
Les chaînes de caractères sont des structures à une seule dimension.
Il faut donc coder les arbres sous forme de chaînes de caractères.
Un des moyens pour effecuer ce codage est fourni par les systèmes de parenthèses.
Le principe de XML n'est pas autre chose qu'une généralisation des systèmes de parenthèses.
  1. Parenthèses et mouvements de pile

    D'une manière générale,
    tout système bien parenthésé peut se traduire par une série de mouvements de pile qui laisse la pile invariante,
    et réciproquement.

    La parenthèse ouvrante s'interprète par empiler (push).
    La parenthèse fermante s'interprète par dépiler (pop).

    Parenthèses & Pile
  2. Mouvements de pile et parcours d'arbres

    Une série de mouvements de pile laissant à la fin la pile invariante traduit un parcours d'arbre (descendant de gauche à droite)
    et réciproquement
    push s'interprète par aller au sommet fils le plus à gauche non encore rencontré
    pop s'interprète par remonter au sommet père du sommet courant

    Pile & Arbre

    Dans cette perspective, chaque occurrence d'une paire de parenthèse ouvrante/fermante correspond à un sommet de l'arbre.

  3. Systèmes à plusieurs types de parenthèses : crochets, accolades, chevrons...

    Il permettent de représenter des arbres à plusieurs types de sommets,
    et des mouvements de pile avec différentes informations dans la pile.
    Exemple :

    Plusieurs Par

  4. Les balises XML sont des parenthèses nommées ...

    Les parenthèses traditionnelles, et leurs alliés les crochets, accolades et chevrons sont des caractères particuliers
    qui possèdent chacun une "image-miroir" : '(' <--> ')', '[' <--> ']', '{' <--> '}' et '<' <--> '>'.
    Leur appartenance au code ASCII assure qu'ils sont connus sur tous les ordinateurs du monde -
    ce qui n'est pas le cas pour les guillemets à la française, par exemple : '«' <--> '»'.
    Mais leur nombre réduit interdit d'exploiter sérieusement la possibilité de leur attacher de l'information.

    On élimine cette limitation au prix d'un codage supplémentaire en réalisant les parenthèses comme des balises :


    On peut ainsi avoir une infinité de sortes de parenthèses, auxquelles on pourra attacher ue quantité d'information abitraire.
    Par exemple, le système du paragraphe précédent à 4 types de parenthèses pourra se coder en XML par le fichier

    <?xml version='1.0'?> <par> <croch> <par> </par> <acc> <chev> </chev> </acc> </croch> </par>

    Avec cette notation, à chaque occurrence d'une paire de balises ouvrante/fermante correspond un sommet de l'arbre.
  5. Visualisation d'un arbre dans un navigateur

    Le navigateur permet d'explorer l'arbre associé au système de parenthèses :

    (  [ ]  { < < > >  }  ( [  ( )  {   <  >  }  ]  ) )

    traduit en XML comme ci-dessus.

    Visu Arbre

    Démonstration (avec Firefox !).


II. XML : mettre du contenu dans un arbre

  1. XML offre trois moyens pour ajouter de l'information dans une structure arborescente.

    1. En nommant les balises (parenthèses) :

      le nom est porteur d'une information qui est attachée au sommet de l'arbre qui correspond à la balise
      (plus exactement,  l'occurrence du couple balise ouvrante / balise fermante).
      L'exemple d'arbre représentant la structure d'une automobile pourra s'écrire : (fichier Voiture-1.xml )

      <Voiture>
        <Carosserie>
          <Capot></Capot>
       
      </Carosserie>
        <Moteur>
          <Cylindres></Cylindres>
          <Allumage>
      </Allumage>
        </Moteur>
        <Transmission>

          <Boîte></Boîte>
          <TrainAV>
      </TrainAV>
              <TrainAR></TrainAR>
        </Transmission>
      </Voiture>
      Arbre

      À noter que
      • le nom doit suivre immédiatement le chevron ouvrant, sans blanc,
      • mais que le chevron fermant peut être précédé de blancs ou de sauts de ligne :
        <Voiture
        >


      En outre, les noms de balises sont soumis à diverses restrictions lexicales :
      grosso modo, ils doivent être des identificateurs au sens de la plupart des langages de programmation.
    2. En ajoutant des attributs aux balises (ouvrantes) :

      le nom de l'attribut et sa valeur portent deux informations attachées au sommet de l'arbre
      qui correspond à la balise (plus exactement,  l'occurrence du couple balise ouvrante / balise fermante).
      Les valeurs d'attributs sont des chaînes de caractères. (fichier Voiture-2.xml )

      <Voiture marque="Renault" modèle="Safrane">
        <Carosserie couleur="rouge">
          <Capot>
      </Capot>
        </Carosserie>
        <Moteur>
          <Cylindres></Cylindres>
          <Allumage>
      </Allumage>
        </Moteur>
        <Transmission type="automatique" nb_vitesses="5">

          <Boîte></Boîte>
          <TrainAV>
      </TrainAV>
              <TrainAR></TrainAR>
        </Transmission>
      </Voiture>

      Bien noter le signe égale et les guillemets de chaîne autour de la valeur des attributs.
      Les noms d'attributs sont également restreints sur le plan lexical (comme les noms de balises)
      les valeurs en revanche sont des chaînes presque ordinaires.
    3. En ajoutant du texte entre les balises :

      (fichier Voiture-3.xml )

      <Voiture marque="Renault" modèle="Safrane">
        <Carosserie couleur="rouge">
          <Capot>
      Un peu cabossé</Capot>
        </Carosserie>
        <Moteur>
          <Cylindres></Cylindres>
          <Allumage>
      Défectueux</Allumage>
        </Moteur>
        <Transmission type="automatique" nb_vitesses="5">

          <Boîte></Boîte>
          <TrainAV>
      </TrainAV>
              <TrainAR></TrainAR>
        </Transmission>
      </Voiture>

      Le texte en question est à peu près libre.
      On peut ajouter du texte "n'importe où", et pas seulement pour constituer des "feuilles" del'arbre
      comme on le fait ici. Cette circonstance est liée à l'histoire de XML comme Markup Language.
  2. Question fondamentale : choix entre attributs et sommets-fils

    <personne nom="Du Nabla" prenom="Jacques" date="22/12/56"/>
    ou bien
    <personne>
        <nom>Du Nabla</nom>
        <prenom>Jacques</prenom>
        <date>22/12/56</date>
    </personne>

    ?????
    Il n'y a pas de règle, c'est une question délicate de modélisation.

    Exemple : trois manières de représenter une liste de noms et de notes.

    1. Les balises portent les noms, les notes sont leurs contenus textuels
      <?xml version="1.0" ?>
      <liste>
          <Pierre> 12 </Pierre >
          <Paul> 13 </Paul>
          <Jacques> 17 </Jacques>
      </liste>

    2. Noms et notes sont attributs de l'élément eleve :
      <?xml version="1.0" ?>
      <liste>
          <eleve nom="Pierre" note="12"></eleve>
          <eleve nom="Paul" note="13"></eleve>
          <eleve nom="Jacques" note="17"></eleve>
      </liste>

    3. Noms et notes sont des éléments à part entière, fils de l'élément eleve :
      <?xml version="1.0" ?>
      <liste>
         <eleve>
          <nom> Pierre</nom> <note> 12 </note>
         </eleve>
         <eleve>
          <nom> Paul</nom> <note> 13 </note>
         </eleve>
         <eleve>
          <nom> Jacques</nom> <note> 17 </note>
         </eleve>
      </liste>


  3. Détails de syntaxe XML : en-tête, feuilles, commentaires, et codage des caractères

    1. En-tête :
      Un fichier XML doit commencer par l'en-tête <?xml version="1.0"?>
      qui doit se trouver tout au commencement du fichier.
      En outre la première balise (nécessairement ouvrante) ne doit se fermer qu'à la fin du fichier.
      [Pas de ssystème de parenthèses décomposable comme "(()()) (())"
       obtenu en concaténant "(()())" et  "(())".]

    2. Parmi les sommets d'un arbre, on distingue les nœuds des feuilles :
      les nœuds ont des fils, les feuilles n'en ont pas (sommets terminaux).

      En XML, on appelle contenu d'un élément tout ce qui est écrit entre les balises : éléments-fils et/ou texte.
      Une feuille est alors un élément qui n'a pas de contenu (élément vide - mais il peut avoir des attributs !)
      L'écriture des feuilles peut être abrégée :
      <nom></nom>  <===> <nom/>
      <objet prix="45"></objet> <===> <objet prix="45"/>
      Avec cette convention l'exemple 2.ii ci-dessus s'écrit :

      <?xml version="1.0" ?>
      <liste>
          <eleve nom="Pierre" note="12"/>
          <eleve nom="Paul" note="13"/>
          <eleve nom="Jacques" note="17"/>
      </liste>



    3. Les commentaires sont écrits entre les pseudo-balises "<!--" et "-->"

      Attention : la séquence de deux signes moins "--" est prohibée dans le corps d'un commentaire !
      Si vous voulez tracer des traits pour présenter votre prose de manière agréablement lisible,
      faites-le avec d'autres caractères (par exemple avec des soulignements "__" ).
      Notez au passage que cette clause interdit ipso facto les commentaires emboîtés.

      Le traitement des blancs, tabs et sauts de ligne dépend de l'application...
      XML lui-même les transmet fidèlement, à la seule exception du saut de ligne
      qui est normalisé en "\n" (ASCII x0A) à la mode Unix
      [contre "\r" (ASCII x0D) chez Macintosh et "\r\n" dans le monde Windows].

    4. La question du codage des caractères :

      Les fichiers XML sont des fichiers de caractères (text) et non pas des fichiers binaires.
      Ce point est essentiel pour assurer l'interopérabilité entre plates-formes.
      Mais il ne faut pas oublier que ces caractères doivent être codés par des octets !
      Et si on se trompe de codage le fichier devient illisible.

      Par défaut, tout fichier XML est censé être codé en Unicode / UTF-8.
      Si tel n'est pas le cas, il faut le mentionner dans l'en-tête par l'attribut optionnel encoding :
      <?xml version="1.0" encoding="ISO-8859-1"?>
      Quand on écrit un fichier XML, il faut donc être attentif au codage adopté par l'éditeur de textes !

      Exemple : avec Safari !
      <?xml version="1.0"?>
      <Capitales>
      <France>Paris</France>
      <España>Madrid</España>
      <Česko>Praha</Česko>
      <Україна>Київ</Україна>
      <България>София</България>
      <Ελλάς>Αθήνα</Ελλάς>
      <Россия>Москва</Россия>
      <საქართველო>თბილისი</საქართველო>
      <Հայաստան>Երեւան</Հայաստան>
      <!-- <ኢትዮጵያ>አዲስ አበባ</ኢትዮጵያ> -->
      <भारत>नई दिल्ली</भारत>
      <தமிழ்_நாடு>ென்னை</தமிழ்_நாடு>
      <ประเทศไทย>กรุงเทพฯ</ประเทศไทย>
      <Việt_Nam>Hà Nội</Việt_Nam>
      <中華>北京</中華>
      <日本国>東京</日本国>
      </Capitales>

      En pratique, il faut tenir compte des limitations des programmes de traitement
      (comme l'illustre la différence de comportement de Safari et de Firefox sur cet exemple),
      et il est souvent prudent de se limiter à l'ASCII ou au Latin-1, qui était la norme il n'y a pas si longtemps !

III. Espaces de noms (Namespaces)

  1. Problème de l'ambiguïté du vocabulaire

    Les fichiers XML sont en général des documents importants destinés à des échanges à travers le réseau, à l'échelle mondiale.
    Les noms des éléments et des attributs jouent un rôle primordial dans l'interprétation de ces documents.

    Un grand nombre d'entre eux ont des significations standard
    p. ex. en HTML : le nom title a un sens et un usage bien définis ;
    plus généralement dans un grand nombre de langages spécialisés basés sur XML (p. ex. XHTML, MathML, VoiceML)
    pour des applications qui interprètent du XML (XML-Schéma, Relax NG, XSLT etc)

    D'où la nécessité d'introduire des domaines nominaux, ou espaces de noms (XML Name Spaces)
    qui permettent de lever l'ambiguïté entre les divers emplois d'une même chaîne de caractères comme nom.

  2. Désigner un domaine nominal

    La désignation d'un espace de noms se fait par un URI :
    par exemple, pour le domaine HTML : http://www.w3.org/HTML/1998/html4

    Un URI (Uniform Resource Identifier) est une chaîne de caractères identifiant une ressource quelconque
    de manière univoque à l'échelle du réseau.
    Il se compose de
    1. une indication de protocole : http
    2. un nom de domaine : www.w3.org
    3. un chemin vers la ressource : /HTML/1998/html4

    Un nom appartenant à ce domaine prend la forme  URL:nom
    par exemple, le nom complet de title en HTML est  "http://www.w3.org/HTML/1998/html4:title"

  3. Nom local et nom complet

    Il est clair que l'emploi systématique des noms complets est beaucoup trop lourd.
    On a donc recours à un système de préfixes déclarés, et à la déclaration d'un domaine par défaut.

    Ces déclarations peuvent avoir lieu dans n'importe quel élément,
    elles sont alors valables pour tous les descendants de cet élément.
    En général on les fait dans l'élément-racine du document.

    Chaque préfixe est déclaré comme un attribut (standard) "xmlns:préfixe=URL"  
    (xmlns = XML NameSpace).
    Le domaine par défaut seulement par "xmlns=URL".

  4. Exemple

    Un document XML où il est question de deux points de vue à la fois
    Cette dualité de points de vue se traduit par :

    [fichier exnmsb.html]

    <?xml version="1.0"?>
    <html
       xmlns="http://www.w3.org/HTML/1998/html4"
       xmlns:xdc="http://www.xml.com/books"
    >
     <head><title>Book Review</title></head>
     <body>
      <xdc:bookreview>
       <h1 style="font-family: sans-serif;">
            <xdc:title>XML: A Primer</xdc:title> </h1>
       <table border="3">
        <tr align="center">
         <td>Author</td><td>Price</td>
         <td>Pages</td><td>Date</td>
        </tr>
        <tr align="left" style="font-family: sans-serif;">
         <td><xdc:author>Simon St.Laurent</xdc:author></td>
         <td><xdc:price>31.98</xdc:price></td>
         <td><xdc:pages>352</xdc:pages></td>
         <td><xdc:date>1998/01</xdc:date></td>
        </tr>
       </table>
      </xdc:bookreview>
     </body>
    </html>


    Résultat de l'interprétation par le navigateur :

    Exemple

  5. Remarques importantes



IV. Exemples de dialectes XML

  1. XHTML : HTML-4 régularisé en XML

    HTML a la même origine que son cadet XML, à savoir SGML, le premier des Markup Languages.
    Il a évolué au gré des progrès techniques et des efforts de normalisation.
    Le succès grandissant de XML a conduit à faire de HTML un dialecte XML.
    Il suffit pour l'essentiel d'imposer une rigueur élémentaire dans l'écriture des balises
    (toujours fermer explicitement une balise ouverte : écrire "<br/>" et non plus "<br>", "<hr />" et non plus "<hr>", sans parler des nombreuses licences tolérées par les navigateurs)
    et dans celle des attributs (valeurs toujours écrites entre guillemets de chaînes).

    La spécification de XHTML ne s'arrête pas là, mais c'est ce qui nous intéressera le plus ici :
    ces contraintes ont en effet pour conséquence que tout document XHTML pourra
    être traité par les outils XML standard, ce qui n'est pas le cas pour HTML.


    fichier exbloc.html visualisable dans n'importe quel navigateur - essayez donc !

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title>Exemple en XHTML</title>
    <style type="text/css">
    body {text-align: center}
    h2 {font-family: monospace}
    </style>
    </head>
    <body>
    <h1><em>Voici du XHTML</em></h1>
    <h2>F&eacute;licitations
    <br />
    pour &ecirc;tre arriv&eacute;(e)
    jusqu'&agrave; moi !
    </h2>
    </body>
    </html>


  2. Les flux RSS


    Exemple : fichier Extrait.xml avec Safari !

    Safari


    <?xml version="1.0" encoding="iso-8859-1"?>
    <rss version="2.0" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
    <channel>
    <title>Le Monde.fr : A la une</title>
    <link>http://www.lemonde.fr</link>
    <description>Toute l'actualité au moment de la connexion</description>
    <copyright>Copyright Le Monde.fr</copyright>
    <image>
    <url>http://medias.lemonde.fr/mmpub/img/lgo/lemondefr_rss.gif</url>
    <title>Le Monde.fr</title>
    <link>http://www.lemonde.fr</link>
    </image>
    <pubDate>Fri, 23 Feb 2007 14:38:06 GMT</pubDate>

    <item>
    <title>
    Pour le FN, l'immigration reste la cause principale des problèmes de la France
    </title>
    <link>
    http://www.lemonde.fr/web/article/0,1-0@2-823448,36-875546,0.html?xtor=RSS-3208
    </link>
    <description>Dans son programme, rendu public ce week-end, le parti
    de M. Le Pen propose &#38;#34;une inversion des flux migratoires&#38;#34;
    et veut diminuer la durée des cartes de séjour de dix à trois ans.
    </description>
    <pubDate>Fri, 23 Feb 2007 13:51:01 GMT</pubDate>
    <guid isPermaLink="false">
    http://www.lemonde.fr/web/article/0,1-0@2-823448,36-875546,0.html?xtor=RSS-3208
    </guid>
    <enclosure url="http://medias.lemonde.fr/mmpub/edt/ill/2006/11/23/h_1_ill_837714_le_pen.jpg"
    type="image/jpeg" length="1923">
    </enclosure>

    </item>

    <item>
    <title>"L'hostilité des Français aux profits est récente", selon David Thesmar</title>
    <link>http://www.lemonde.fr/web/article/0,1-0@2-3234,36-875560,0.html?xtor=RSS-3208</link>
    <description>Le professeur à HEC rappelle que &#38;#34;jusqu&#38;#39;à la fin des années 1920,
    la France était l&#38;#39;amie des marchés financiers&#38;#34;.
    </description>
    <pubDate>Fri, 23 Feb 2007 14:06:50 GMT</pubDate>
    <guid isPermaLink="false">
    http://www.lemonde.fr/web/article/0,1-0@2-3234,36-875560,0.html?xtor=RSS-3208
    </guid>
    <enclosure url="http://medias.lemonde.fr/mmpub/edt/ill/2007/02/23/h_1_ill_812370_total.jpg"
    type="image/jpeg" length="1968">
    </enclosure>
    </item>

    <!-- autres items -->

    <item>

    <title>D&#233;p&#234;che: Airbus: Chirac et Merkel s'accordent sur un partage des efforts</title>
    <link>http://www.lemonde.fr/web/depeches/0,14-0,39-29881330@7-37,0.html?xtor=RSS-3208</link>
    <description>Retrouvez l'ensemble des d&#233;p&#234;ches sur http://www.lemonde.fr
    </description>
    <pubDate>Fri, 23 Feb 2007 12:22:10 GMT</pubDate>
    <guid isPermaLink="false">
    http://www.lemonde.fr/web/depeches/0,14-0,39-29881330@7-37,0.html?xtor=RSS-3208
    </guid>
    </item>

    </channel>
    </rss>


    Cet extrait provient d'un fichier plus long venant du site du Monde : fichier 0,2-3208,1-0,0.xml.

    Contrairement à ce qu'on attendrait, les fichiers RSS (Really Simple Syndication) ne font pas appel à un espace de noms spécifique.
    La référence à RDF paraît sans conséquence pratique...

    Le format minimum d'un Document RSS 2.0 est le suivant (http://www.rssboard.org/rss-specification):
    1. L'élément-racine est <rss version="2.0">.
    2. La racine a exactement un fils, qui est un élément <channel>.
    3. Ledit <channel> possède d'abord 3 fils :
      1. un élément <title>, qui contient du texte,
      2. un élément <description>, qui contient du texte,
      3. un élément <link>, qui contient aussi du texte (une URL).
    4. Le <channel> contient ensuite un nombre quelconque d'éléments <item>.
    5. Chaque <item> possède au moins un fils, qui peut être
      • un élément <title>, qui contient du texte,
      • ou un élément <description>, qui contient aussi du texte.
      Il peut contenir les deux,
      et on peut utilement lui ajouter un élément <link>, qui contient aussi du texte (une URL).
      Cette URL sera "cliquable" pour obtenir une forme développée de l'information donnée par l'<item>.