2. Structure de base d’un fichier XML

La structure de base d’un fichier XML – on parlera d’ailleurs plutôt de « document » XML – est assez simple, et très précise. Rappelons-nous que le XML est une évolution du HTML, il est donc logique d’y retrouver le même genre d’éléments.

2.1. Un fichier XML simple

Voyons immédiatement un premier fichier XML.

Exemple 1. Un premier document XML, fichier marins.xml

<?xml version="1.0" encoding="UTF-8"?>

 <!-- un premier marin -->
 <marin  id="12">
	 <nom>Surcouf</nom>
	 <prenom>Robert</prenom>
	 <remarque  lang="FR">Capitaine corsaire</remarque>
 </marin>

Analysons ce premier document. La première ligne est une déclaration, elle commence par un <? et se termine par un ?>. Elle est facultative, mais on la trouve systématiquement. Les éditeurs de fichiers XML la mettent souvent par défaut. Elle signifie simplement que le XML contenu dans ce fichier correspond à la version 1.0 de la norme W3C, et que le fichier est encodé avec le jeu de caractères UTF-8. La deuxième ligne est blanche ; à la différence des fichiers HTML ancienne génération. Cette ligne blanche n’a aucun caractère obligatoire. La troisième ligne est un commentaire. En XML, les commentaires sont écrits entre une séquence de caractères <!-- et -->. Un commentaire peut s'étaler sur plusieurs lignes. Enfin suit le contenu du document proprement dit. Un document est composé d’éléments. Un élément XML est composé d’une balise ouvrante : <marin>, d’un contenu, et d’une balise fermante </marin>. Un élément peut ne pas avoir de contenu, auquel cas on peut utiliser une notation contractée : <marin/>. Un élément peut contenir un ou plusieurs sous-éléments, comme c’est le cas sur notre exemple. En revanche, deux éléments ne peuvent pas se chevaucher : il n’est pas légal d’avoir deux balises ouvrantes à la suite, puis la balise fermante de la première balise, suivie de la balise fermante de la deuxième. La première règle de validité d’un document XML, est qu’il ne doit posséder qu’un seul nœud racine. Dans notre exemple, il ne serait pas possible d’ajouter un deuxième nœud marin à la suite du premier. Notre document possèderait alors deux nœuds racine, ce qui est illégal. Enfin, il est possible de créer des attributs sur un élément. Il n’y a pas de limite au nombre d’attributs que l’on peut mettre dans un élément. Un attribut possède un nom et une valeur. Deux exemples d’attributs sont donnés : id pour l’élément marin, et lang pour l’élément commentaire. La valeur d’un attribut est nécessairement rangée entre deux ", à la différence du HTML où l’on peut aussi utiliser le '. Comme on le voit, le format d’un fichier XML est une chose très simple, facilement lisible par un humain et compréhensible.

2.2. Notion d’espaces de noms

Comme on le voit déjà sur notre exemple simple, certaines de nos balises ont des noms très génériques : les balises nom et prenom par exemple. Cela peut poser un problème en cas d’échange de documents XML entre deux systèmes différents : que se passera-t-il si un autre système a également défini des éléments nom et prenom, mais possédant un sens différent, voire des contraintes différentes ? Le problème se pose dans les mêmes termes lorsque l’on crée des classes Java, et est résolu de la même façon. En Java, on range nos éléments et classes dans des espaces de nom, implémentés sous forme de packages. Cette notion existe également en XML. Un espace de nom en XML est défini par deux choses : une référence, et le nom de cet espace. En général, le nom de cet espace est une URL (en toute rigueur il s’agit d’une URI), et sa référence une simple chaîne de caractères. Reprenons notre exemple précédent en l’écrivant dans l’espace de nom galilee.

Exemple 2. Première utilisation d'un espace de nom

<?xml version="1.0" encoding="UTF-8"?>

 <!-- un premier marin -->
 <galilee:marin  id="12" 
	 xmlns:galilee="http://www.galilee.org/cours-xml">
	
	 <galilee:nom>Surcouf</galilee:nom>
	 <galilee:prenom>Robert</galilee:prenom>
	 <galilee:remarque  lang="FR">Capitaine corsaire</galilee:remarque>
 </galilee:marin>

Comme on peut le voir, cette déclaration se fait par l’ajout d’un attribut standard de notre nœud racine : xmlns:galilee, qui prend pour valeur http://www.galilee.org/cours-xml. Cette déclaration définit un espace de nom, de valeur « http://www.galilee.org/cours-xml », référencé par le préfixe galilee. Ensuite, les éléments de notre document ont été préfixés par galilee:, de façon à les attacher à l’espace de noms que l’on vient de définir. Notons que l’URL qui sert de nom à notre espace peut prêter à confusion : il s’agit juste d’un nom générique, et non pas d’une ressource qui doit être disponible sur l’Internet. Java préconise de prendre des noms de domaine lus à l’envers pour créer des noms de packages, dans le but de garantir leur unicité. Le W3C a fait un peu la même chose : sauf qu’il préconise de prendre les URL sans les changer. Cela crée toutefois une ambigüité, que nous verrons par la suite. On peut bien sûr définir et utiliser plusieurs espaces de noms pour un même document, comme nous le verrons dans la suite.
API Java pour XML
Retour au blog Java le soir
Cours & Tutoriaux
Table des matières
Introduction
1. Un peu d'histoire
2. Les API Java pour XML
Un premier exemple
1. Introduction
2. Structure de base d’un fichier XML
2.1. Un fichier XML simple
2.2. Notion d’espaces de noms
3. Un premier code pour lire un fichier XML
3.1. Lecture avec Dom4J
Description d’un document XML
1. Introduction
2. Organisation d'un document XML
2.1. Introduction
2.2. Nœuds dans un document XML
2.3. Relations entre nœuds dans un document XML
2.4. Ordre dans un document
2.5. Valeurs atomiques dans un document XML
2.6. Notion de PCDATA et CDATA
3. Document Type Definition (DTD)
3.1. Attacher un document à une DTD
3.2. Contenu d’une DTD
3.3. Exemple de DTD, analyse de web-app_2_3.dtd
4. XML Schema
4.1. Introduction
4.2. Un premier schéma
4.3. Attacher un document XML à un schéma
4.4. Types simples
4.5. Attribut
4.6. Restriction sur une déclaration
4.7. Types complexes
4.8. Contraindre un contenu simple
Lire et écrire du XML
1. Introduction
2. Utilisation de DOM4J
2.1. Introduction
2.2. Un premier exemple simple
2.3. Organisation de l'API
2.4. Classe Namespace
2.5. Classe QName
2.6. Interface Node
2.7. Interface Branch
2.8. Interface Document
2.9. Interface Element
2.10. Interface Attribute
2.11. Interface Text
3. Utilisation de Xerces
3.1. Introduction
3.2. Présentation de SAX
3.3. Présentation de DOM
Analyseur SAX en Xerces
1. Introduction
2. Création d'un analyseur SAX
2.1. Introduction
2.2. Objet DefaultHandler
2.3. Exemple d'analyse d'un fichier
3. Présentation de l'API
3.1. Interface ContentHandler
3.2. Interface ErrorHandler
3.3. Interface DTDHandler
3.4. Interface EntityResolver
3.5. Interface LexicalHandler
Manipuler un DOM en Xerces
1. Introduction
2. Création d'un DOM
3. Présentation de l'API
3.1. Organisation de l'API
3.2. Interface Node
3.3. Interface NodeList
3.4. Interface Element
3.5. Interface Attr
3.6. Interface CharacterData
3.7. Interface Comment
3.8. Interface CDATASection
3.9. Interface Text
3.10. Interface Entity
3.11. Interface EntityReference
3.12. Interface ProcessingInstruction
3.13. Interface Document
3.14. Interface DocumentFragment
3.15. Interface DocumentType
Interroger un document en XPath
1. Introduction, notion de nœud XML
2. Une première requête XPath
2.1. Un premier document à interroger
2.2. Une première requête
2.3. Forme d'une requête XPath