Aller au contenu

S01 · Fondamentaux XML

À la fin de cette séance, vous savez :

  1. expliquer à quoi sert XML et où on le rencontre aujourd’hui ;
  2. écrire un document XML bien formé et corriger les erreurs signalées par xmllint ;
  3. choisir entre élément et attribut pour représenter une information ;
  4. utiliser les entités, les sections CDATA et les commentaires ;
  5. déclarer et utiliser un espace de noms.

XML (eXtensible Markup Language, recommandation W3C de 1998) est un langage de balisage générique. Contrairement à HTML, les balises ne sont pas imposées : c’est vous qui les définissez pour décrire vos données.

XML sert encore beaucoup en 2026 :

Domaine Exemples
Bureautique .docx, .xlsx, .odt (archives zip de fichiers XML)
Web et graphisme SVG, flux RSS/Atom, sitemaps
Échanges entre SI factures électroniques (UBL, Factur-X), SOAP, formats bancaires ISO 20022
Configuration Maven pom.xml, Android AndroidManifest.xml, .NET .csproj
Édition et documentation DocBook, DITA, TEI

À retenir : XML décrit la structure et le sens des données, pas leur présentation.

<?xml version="1.0" encoding="UTF-8"?> <!-- prologue -->
<!-- Catalogue de la médiathèque --> <!-- commentaire -->
<catalogue> <!-- élément racine (unique) -->
<livre isbn="9782070368228" genre="roman"> <!-- élément avec attributs -->
<titre>L'Étranger</titre> <!-- contenu textuel -->
<annee>1942</annee>
<exemplaires>3</exemplaires>
<disponible/> <!-- élément vide -->
</livre>
</catalogue>
flowchart TD
  C[catalogue] --> L["livre (@isbn, @genre)"]
  L --> T["titre : L'Étranger"]
  L --> A["annee : 1942"]
  L --> E["exemplaires : 3"]
  L --> D[disponible]

Un document XML est un arbre : une seule racine, et chaque élément a exactement un parent (sauf la racine).

  • version="1.0" : utilisez toujours 1.0 (XML 1.1 n’est quasiment pas utilisé).
  • encoding="UTF-8" : c’est la valeur par défaut. L’encodage déclaré doit correspondre à l’encodage réel du fichier.
  • Le prologue est facultatif, mais s’il est présent il doit être tout au début du fichier, sans espace ni ligne vide avant.

Un document est bien formé s’il respecte la syntaxe XML. Sinon, aucun outil ne l’accepte : un parseur XML s’arrête à la première erreur, contrairement à un navigateur face à du HTML.

Règle Incorrect Correct
Une seule racine <livre/><livre/> <catalogue><livre/><livre/></catalogue>
Toute balise ouverte est fermée <titre>Dune <titre>Dune</titre> ou <br/>
Imbrication correcte <a><b></a></b> <a><b></b></a>
Sensible à la casse <Titre></titre> <titre></titre>
Valeurs d’attribut entre guillemets annee=1965 annee="1965" ou annee='1965'
Pas d’attribut en double <livre genre="a" genre="b"> un seul genre
< et & échappés dans le texte <prix>< 10 & plus</prix> <prix>&lt; 10 &amp; plus</prix>
Noms valides <1er>, <mon titre> <premier>, <mon_titre>

Noms XML : ils commencent par une lettre ou _, puis contiennent lettres, chiffres, -, _ et .. Les noms commençant par xml (quelle que soit la casse) sont réservés.

Fenêtre de terminal
xmllint --noout catalogue.xml # aucune sortie : le document est bien formé
catalogue.xml:5: parser error : Opening and ending tag mismatch: titre line 5 and livre

Lisez le numéro de ligne et le message : l’erreur réelle se trouve souvent un peu avant la ligne indiquée.

Les deux sont valides, mais ils ne jouent pas le même rôle.

Critère Élément Attribut
Structure interne (sous-éléments) ✅ ❌ (valeur texte simple)
Répétition (plusieurs valeurs) ✅ ❌ (un seul par nom)
Ordre significatif ✅ ❌ (l’ordre n’est pas garanti)
Texte long, avec mise en forme ✅ ❌
Identifiant, code, métadonnée courte possible ✅ idéal

Règle pratique : l’attribut sert aux métadonnées et identifiants (isbn, id, langue, unite), l’élément sert aux données elles-mêmes (titre, resume, auteur).

<!-- Mauvais : auteurs multiples impossibles, résumé long dans un attribut -->
<livre titre="Dune" auteur="Frank Herbert" resume="Sur la planète Arrakis..."/>
<!-- Bon -->
<livre isbn="9782266320481" langue="fr">
<titre>Dune</titre>
<auteur ref="A01"/>
<resume>Sur la planète Arrakis...</resume>
</livre>

5. Entités, CDATA, commentaires et instructions de traitement

Section intitulée « 5. Entités, CDATA, commentaires et instructions de traitement »
Entité Caractère Obligatoire ?
&lt; < oui, dans le texte et les attributs
&amp; & oui, partout
&gt; > conseillé (obligatoire dans la séquence ]]>)
&quot; " dans un attribut délimité par "
&apos; ' dans un attribut délimité par '

Références de caractères : &#233; (é en décimal), &#x20AC; (€ en hexadécimal). Elles sont rarement utiles en UTF-8.

⚠️ &eacute;, &nbsp;… n’existent pas en XML : ce sont des entités HTML. Elles ne fonctionnent que si une DTD les déclare (voir S02).

Le texte d’une section CDATA n’est pas analysé : pratique pour y placer du code.

<exemple langage="js"><![CDATA[
if (a < b && b > 0) { console.log("<ok>"); }
]]></exemple>

La seule séquence interdite à l’intérieur est ]]>.

<!-- texte -->. On ne peut pas y mettre -- et on ne peut pas les imbriquer.

<?cible données?> : ce sont des consignes destinées à une application. L’exemple typique associe une feuille XSLT (S05) :

<?xml-stylesheet type="text/xsl" href="catalogue.xsl"?>

Problème : deux vocabulaires peuvent utiliser le même nom avec des sens différents. Par exemple, <titre> désigne le titre d’un livre dans le catalogue, et le titre de civilité d’un adhérent dans le fichier des membres.

Solution : associer chaque nom à un URI qui identifie le vocabulaire.

<catalogue xmlns="urn:bibliotech:catalogue"
xmlns:m="urn:bibliotech:membres">
<livre isbn="9782070368228">
<titre>L'Étranger</titre> <!-- espace urn:bibliotech:catalogue (défaut) -->
</livre>
<m:adherent m:id="M01">
<m:titre>Mme</m:titre> <!-- espace urn:bibliotech:membres -->
<m:nom>Salma Bennani</m:nom>
</m:adherent>
</catalogue>

Points clés :

  • L’URI n’est qu’un identifiant : il n’est jamais téléchargé et peut être un urn: ou une URL fictive.
  • xmlns="…" définit l’espace par défaut : il s’applique aux éléments sans préfixe, mais pas aux attributs sans préfixe.
  • Le préfixe (m) est un simple alias local. Ce qui compte, c’est l’URI : m:nom et x:nom désignent le même nom si m et x pointent vers le même URI.
  • La déclaration vaut pour l’élément qui la porte et tous ses descendants.

Vous rencontrerez des espaces de noms standard : XSD (http://www.w3.org/2001/XMLSchema), XSLT (http://www.w3.org/1999/XSL/Transform), SVG, XHTML.

XML JSON HTML
Objectif Données structurées et documents Données structurées Présentation de pages web
Balises libres aucune (objets et tableaux) fixées par la norme
Syntaxe stricte stricte tolérante
Validation DTD, XSD, RelaxNG JSON Schema —
Requêtes et transformations XPath, XSLT, XQuery JSONPath, jq DOM, CSS
Commentaires, espaces de noms, contenu mixte ✅ ❌ partiel
Verbosité élevée faible moyenne

Le même livre en JSON :

{ "isbn": "9782070368228", "genre": "roman", "titre": "L'Étranger", "annee": 1942, "exemplaires": 3 }

JSON s’est imposé pour les API web (le module 2 l’utilise partout). XML reste très présent dès qu’il faut des documents, du contenu mixte (du texte avec du balisage à l’intérieur), des contrats de validation stricts ou des échanges normalisés.

  • Un espace ou une ligne vide avant <?xml …?> : erreur « XML declaration allowed only at the start ».
  • Copier du HTML avec &nbsp; ou <br> : entité inconnue, ou balise jamais fermée.
  • Un & dans une URL (?a=1&b=2) : il faut écrire &amp;.
  • Oublier que XML est sensible à la casse.
  • Croire que l’URI d’un espace de noms doit être accessible en ligne.
  • Fichier enregistré en Windows-1252 alors que le prologue déclare UTF-8 : les accents deviennent illisibles ou provoquent une erreur.
  • Un document XML est un arbre avec une racine unique.
  • Bien formé signifie syntaxe correcte, et c’est une condition non négociable. Valide signifie conforme à une grammaire : ce sera l’objet de S02 et S03.
  • L’attribut sert aux métadonnées simples, l’élément aux données structurées, répétées ou longues.
  • &lt; et &amp; sont obligatoires dans le texte ; CDATA sert pour les blocs de code.
  • Un espace de noms est un URI associé aux noms : le préfixe n’est qu’un alias.
  1. Citez quatre règles qu’un document doit respecter pour être bien formé.
  2. Pourquoi l’auteur d’un livre doit-il être un élément plutôt qu’un attribut ?
  3. Dans <c xmlns="urn:a"><d x="1"/></c>, dans quel espace de noms se trouvent d et x ?