S01 · Fondamentaux XML
Objectifs de la séance
Section intitulée « Objectifs de la séance »À la fin de cette séance, vous savez :
- expliquer à quoi sert XML et où on le rencontre aujourd’hui ;
- écrire un document XML bien formé et corriger les erreurs signalées par
xmllint; - choisir entre élément et attribut pour représenter une information ;
- utiliser les entités, les sections CDATA et les commentaires ;
- déclarer et utiliser un espace de noms.
1. Pourquoi XML ?
Section intitulée « 1. Pourquoi XML ? »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.
2. Anatomie d’un document
Section intitulée « 2. Anatomie d’un document »<?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).
Le prologue
Section intitulée « Le prologue »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.
3. Les règles d’un document bien formé
Section intitulée « 3. Les règles d’un document bien formé »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>< 10 & 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.
Vérifier avec xmllint
Section intitulée « Vérifier avec xmllint »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 livreLisez le numéro de ligne et le message : l’erreur réelle se trouve souvent un peu avant la ligne indiquée.
4. Élément ou attribut ?
Section intitulée « 4. Élément ou attribut ? »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és prédéfinies
Section intitulée « Entités prédéfinies »| Entité | Caractère | Obligatoire ? |
|---|---|---|
< |
< |
oui, dans le texte et les attributs |
& |
& |
oui, partout |
> |
> |
conseillé (obligatoire dans la séquence ]]>) |
" |
" |
dans un attribut délimité par " |
' |
' |
dans un attribut délimité par ' |
Références de caractères : é (é en décimal), € (€ en hexadécimal). Elles sont rarement utiles en UTF-8.
⚠️
é, … n’existent pas en XML : ce sont des entités HTML. Elles ne fonctionnent que si une DTD les déclare (voir S02).
Section CDATA
Section intitulée « Section CDATA »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 ]]>.
Commentaires
Section intitulée « Commentaires »<!-- texte -->. On ne peut pas y mettre -- et on ne peut pas les imbriquer.
Instructions de traitement
Section intitulée « Instructions de traitement »<?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"?>6. Espaces de noms (namespaces)
Section intitulée « 6. Espaces de noms (namespaces) »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:nometx:nomdésignent le même nom simetxpointent 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.
7. XML, JSON et HTML
Section intitulée « 7. XML, JSON et HTML »| 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.
Pièges fréquents
Section intitulée « Pièges fréquents »- Un espace ou une ligne vide avant
<?xml …?>: erreur « XML declaration allowed only at the start ». - Copier du HTML avec
ou<br>: entité inconnue, ou balise jamais fermée. - Un
&dans une URL (?a=1&b=2) : il faut écrire&. - 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.
<et&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.
Questions de récupération (début de S02)
Section intitulée « Questions de récupération (début de S02) »- Citez quatre règles qu’un document doit respecter pour être bien formé.
- Pourquoi l’auteur d’un livre doit-il être un élément plutôt qu’un attribut ?
- Dans
<c xmlns="urn:a"><d x="1"/></c>, dans quel espace de noms se trouventdetx?