CodeGym /Cours /JAVA 25 SELF /Bases de XML et des espaces de noms

Bases de XML et des espaces de noms

JAVA 25 SELF
Niveau 47 , Leçon 0
Disponible

1. Introduction à XML

Bien que JSON soit aujourd’hui la norme, le monde Java regorge de code legacy, il peut donc arriver que vous rencontriez XML. Il est donc utile d’en avoir une compréhension de base. XML (eXtensible Markup Language) est un format texte pour stocker et échanger des données structurées. Il est souvent utilisé pour les configurations, les échanges entre programmes, le stockage de données et même la sérialisation d’objets.

Éléments fondamentaux de la structure d’un document XML :

Balises (éléments) :
Tout ce qui se trouve entre < et >. Chaque balise s’ouvre (<tag>) et se ferme (</tag>), ou est auto-fermante (<tag/>).

Attributs :
Paramètres supplémentaires à l’intérieur de la balise.
Exemple : <user name="John" age="25"/>

Nœuds de texte :
Texte entre les balises.
Exemple : <greeting>Bonjour, monde !</greeting>

Exemple de document XML simple

<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user name="John" age="25">Bonjour !</user>
    <user name="Alice" age="30"/>
</users>

Ici :

  • <users> — l’élément racine.
  • <user> — un élément avec les attributs name et age ; le premier utilisateur possède un contenu textuel.

2. Concepts clés

Prologue :
La ligne au début du fichier indique la version de XML et l’encodage.
Exemple : <?xml version="1.0" encoding="UTF-8"?>

Éléments :
Les blocs de construction de base de XML.
Exemple : <book>...</book>

Attributs :
Paramètres à l’intérieur de la balise ouvrante.
Exemple : <book title="Java" author="Smith"/>

Commentaires :
Comme en HTML, ils s’écrivent entre <!-- ... -->.
Exemple : <!-- Ceci est un commentaire -->

Sections CDATA :
Elles permettent d’insérer du texte qui ne sera pas interprété comme XML (par exemple avec les caractères <, &, etc.).
Exemple :

<script><![CDATA[
    if (a < b && b > 0) { ... }
]]></script>

3. Pourquoi a-t-on besoin des namespaces (espaces de noms) en XML

Problème : conflit de noms

Dans les grands documents XML, on rencontre souvent des noms de balises identiques mais avec des significations différentes. Par exemple, vous avez <table> comme partie de HTML et <table> comme partie de votre logique métier (par exemple, une base de données). Comment savoir à quoi correspond chaque balise ?

Sans namespace :

<root>
    <table>
        <row>...</row>
    </table>
    <table>
        <column>...</column>
    </table>
</root>

Ici, il n’est pas clair à quoi correspond chaque <table>.

Solution : namespaces

Un namespace (espace de noms) est un moyen de « marquer » les éléments et attributs pour éviter les conflits de noms et séparer clairement le sens des différentes balises.

  • Chaque namespace est un URI unique (il ressemble souvent à un lien, mais ce n’est qu’un identifiant).
  • Des éléments et attributs avec des namespaces différents sont considérés comme différents, même si le nom est identique.

Avantages :

  • Pas de conflits de noms entre différents standards et schémas.
  • Possibilité de combiner des données de différentes sources dans un même document.
  • On voit clairement à quel « dictionnaire » appartient chaque balise.

4. Utilisation des namespaces : déclaration et usage

Comment déclarer un namespace

Dans la balise ouvrante d’un élément, on écrit un attribut spécial xmlns (XML Namespace) :

  • Sans préfixe : xmlns="URI" — déclare un namespace par défaut pour tous les éléments imbriqués.
  • Avec préfixe : xmlns:prefix="URI" — déclare un namespace avec un nom court (préfixe) utilisé pour les balises.

Exemple de déclaration et d’utilisation d’un namespace

<root xmlns:h="http://www.w3.org/TR/html4/"
      xmlns:f="http://www.w3schools.com/furniture">
    <h:table>
        <h:tr>
            <h:td>Cellule 1</h:td>
            <h:td>Cellule 2</h:td>
        </h:tr>
    </h:table>
    <f:table>
        <f:name>Table</f:name>
        <f:width>80</f:width>
        <f:length>120</f:length>
    </f:table>
</root>

Ici :

  • xmlns:h="..." — déclare le préfixe h pour la table HTML.
  • xmlns:f="..." — déclare le préfixe f pour le mobilier.
  • <h:table> et <f:table> — ce sont désormais des éléments différents, même si le nom est identique.

Comment utiliser un namespace

  • Déclaration : Dans l’élément racine ou n’importe quel autre élément : xmlns:prefix="URI"
  • Utilisation : Avant le nom de l’élément ou de l’attribut, on écrit le préfixe et deux-points : <prefix:element>...</prefix:element>

Namespace par défaut

Si vous déclarez simplement xmlns="URI", tous les éléments sans préfixe appartiendront à ce namespace.

<books xmlns="http://example.com/books">
    <book>...</book>
</books>

5. Pratique : créer un document XML simple avec plusieurs namespaces

Créons un exemple de document XML qui utilise deux espaces de noms : pour HTML et pour le mobilier.

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:h="http://www.w3.org/TR/html4/"
      xmlns:f="http://www.w3schools.com/furniture">
    <h:table>
        <h:tr>
            <h:td>Cellule 1</h:td>
            <h:td>Cellule 2</h:td>
        </h:tr>
    </h:table>
    <f:table>
        <f:name>Table</f:name>
        <f:width>80</f:width>
        <f:length>120</f:length>
    </f:table>
</root>

Ce qui se passe ici :

  • Deux namespaces sont déclarés dans l’élément racine : h et f.
  • Tous les éléments avec le préfixe h: appartiennent à la table HTML.
  • Tous les éléments avec le préfixe f: appartiennent au mobilier.

6. Erreurs courantes

Erreur 1 : vous avez oublié de déclarer le préfixe

<root>
    <h:table>...</h:table>
</root>

Résultat : L’analyseur XML renverra une erreur : The prefix 'h' for element 'h:table' is not bound.

Erreur 2 : noms identiques sans namespace

<root>
    <table>...</table>
    <table>...</table>
</root>

Résultat : Impossible de distinguer à quoi correspond chaque <table>.

Erreur 3 : utilisation incorrecte du préfixe

<root xmlns:h="http://www.w3.org/TR/html4/">
    <h:table>...</h:table>
    <f:table>...</f:table> <!-- Erreur : le préfixe f n'est pas déclaré -->
</root>

Résultat : Erreur de l’analyseur : The prefix 'f' for element 'f:table' is not bound.

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION