4) XML

SGML (Standard Generalized Markup Language) est caractérisé par son choix de "markup" descriptif (utilisation de marques pour séparer les différentes parties d'un document), son concept de Document Type Définition (déclaration des différentes parties du document et de leur organisation) et son indépendance de tout système pour représenter le texte écrit (remplacement de certains caractères par des "entités" indépendantes des jeux de caractères). Un analyseur (parser) vérifie que le document est conforme à sa DTD et tous les documents de même type peuvent être traités de la même façon.
La DTD (Document Type Definition) donne la grammaire du contenu légal d'un document XML. Elle en décrit les éléments types, les attributs des éléments, les entités pouvant être incluses, les notations de données externes. Une DTD peut être déclarée dans le document HTML ou par une référence externe (ou pas déclarée du tout !).
XML (Extensible Markup Language) a été conçu en 1996 par le W3C pour utiliser la puissance et la flexibilité du SGML en diminuant sa complexité. C'est un langage de description de données. Associé à une DTD ou à un Schéma XML, il est conçu pour être auto-descriptif.
XML n'est pas le remplaçant du HTML car leurs buts sont différents. Le premier est conçu pour décrire des informations, le second pour les afficher. XML n'est pas conçu pour FAIRE quoi que ce soit des données qu'il contient cependant, à l'aide du HTML, il rend possible l'utilisation de structures SGML sur le Web.

XML décrit des objets appelés "documents XML" dont la structure est conforme aux documents SGML. Les documents XML sont des unités structurées de stockage de données. En accord avec ses buts originaux :

Le succès de XML dans l'univers des bases de données a été foudroyant. Ses données, séparées du HTML, peuvent être maintenues sans toucher aux fichiers d'utilisation. Son format public "plain text" ne le limite à aucun système matériel ou logiciel. Méta-langage utilisé pour créer de nouveaux langages comme WAP et WML, il est aussi devenu le langage principal d'échange d'informations financières sur l'internet. Si Microsoft le veut bien, il sera au coeur de traitements de texte, tableurs et bases de données échangeant des informations sans aucune conversion.
Chaque document XML a, à la fois, une structure physique et logique. Physiquement, à partir de la racine (document entity), le document est composé d'entités peuvant contenir d'autres entités. Logiquement, il est composé d'éléments délimités par des marques explicites. Les structures logiques et physiques doivent être proprement imbriquées.

<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<pour>Roméo</pour>
<de>Juliette</de>
<objet>Rappel</objet>
<message>Ne m'oublie pas ce week-end !</message>
</note>
La première ligne déclare la version XML et le jeu de caractères utilisé
La ligne suivante désigne la racine de ce document (<note>)
Les lignes suivantes décrivent 4 éléments de la racine
La dernière ligne marque la fin de la racine.
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE note [
  <!ELEMENT note (pour, de, objet, message)> 
  <!ELEMENT pour (#PCDATA)>
  <!ELEMENT de (#PCDATA)>
  <!ELEMENT objet (#PCDATA)>
  <!ELEMENT message (#PCDATA)>
]> 
<note> ... </note>
On peut compléter le document par une DTD interne.
Elle est déclarée entre crochets à l'intérieur de <!DOCTYPE ...>.
Si aucune référence n'est faite à une DTD externe, on donne à l'attribut standalone (autonome) la valeur "yes".
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note> ... </note>
Avec une DTD externe, on donne à standalone la valeur "no".
Le fichier de définition doit avoir le même nom que la racine du document XML.
Quand la DTD utilisée est enregistrée sous forme de norme, on remplace SYSTEM par PUBLIC.

Deux DTD (interne et externe) peuvent coexister en laissant la priorité aux définitions internes.
Un document XML peut ne pas avoir de DTD mais, s'il n'est pas "bien formé", il ne sera pas affiché par un navigateur.
XML est libre et extensible. Il est constitué de texte brut contenant des tags enfermés dans des crochets pointus (angle brackets). Contrairement au HTML, les tags ne sont pas prédéfinis. L'auteur doit créer toutes ses balises et sa propre structure de document comme ci-dessus avec <pour>, <de>, ... qui ne sont définis par aucun XML standard.
Quelques règles du XML :
Le tag de fermeture est obligatoire. <p> est autorisé en HTML, <p> ... </p> est obligatoire en XML (le tag de déclaration n'appartient pas au document XML).
Les tags sont sensibles à la casse (<Note> est différent de <note>)
Tout document XML doit avoir un élément de base (racine) ouvert puis fermé. Tous les autres éléments doivent être contenus dans l'élément de base et peuvent contenir d'autres éléments. Les éléments contenus doivent être correctement imbriqués.
Les valeurs d'attributs doivent être "entre cotes"
Les espaces sont conservés contrairement au HTML qui les réduit à un.
Une fin de ligne est enregistrée sous le format LF (Windows : CR(13) & LF(12), Unix : LF, Mac : CR). C'est la fin du modèle "machine à écrire" où après le passage à la ligne (line feed), il fallait ramener le chariot à gauche (carriage return).
Les commentaires sont comme en HTML <!-- Voici un commentaire -->

Les éléments XML sont hiérarchisés
<livre>
<titre>Premier XML</titre>
<prod id="33-657" media="papier"></prod>
<chapitre>Introduction au XML
<para>Qu'est ce que HTML</para>
<para>Qu'est ce que XML</para>
</chapitre>
<chapitre>Syntaxe XML
<para>Les éléments doivent avoir un tag de fin</para>
<para>Les éléments doivent être correctement imbriqués</para>
</chapitre>
</livre>
<livre> est la racine
<titre>, <prod> et <chapitre> sont les enfants de <livre>
<livre> est le parent de <titre>, <prod> et <chapitre>
<titre>, <prod> et <chapitre> sont des frères (ou soeurs)

Un élément XML est tout ce qui est contenu entre le tag de début et le tag de fin, tags inclus
Ce contenu peut être composé d'éléments (comme <livre>), mixte (du texte et des éléments comme <chapitre>), simple (du texte seulement comme <para>), ou vide (comme <prod>). Un élément peut avoir des attributs ayant chacun une valeur (id et media pour <prod>).
Les noms d'éléments peuvent contenir toutes sortes de caractères mais, ils ne doivent pas commencer par un chiffre, un caractère de ponctuation ou les lettres xml, ils ne doivent pas contenir d'espaces ni le signe : (deux points) qui a une autre signification. Les lettres non anglaises sont légales mais peuvent provoquer des problèmes de soft de même que - (tiret) et . (point). Aucun mot n'est réservé. On peut donner des noms significatifs en utilisant _ (underscore) sans exagération de longueur. Si on souhaite associer XML à une base de données, on appliquera aux noms d'éléments les règles qui s'appliquent aux champs de celle-ci.
XML avec une syntaxe correcte est dit XML Bien Formé
XML validé parune DTD est dit XML Valide
Les fichiers XML bruts sont reconnus par les navigateurs (depuis IE 5.0 et Netscape 6).
Utilisation des fichiers XML
Les exemples qui suivent, adaptés du site "pédagogique" du W3C, ont tous été essayé avec succés dans IE6.
Avec un fichier CSS (Cascading Style Sheets)
Voici un fichier XML tout cru (Catalog.xml)
Voici un fichier CSS associé au précédent (Catalog.css)
Relions le fichier XML précédent à la feuille de style précédente (CatalogCSS.xml) par :
<?xml-stylesheet type="text/css" href=Catalog.css"?>
Pas mal sans aucune balise HTML ! Mais le W3C ne croit pas en l'avenir de cette méthode. Il préconise, aussitôt que les navigateurs le permettront, de formater les fichiers XML avec des fichiers XSL comme dans l'exemple suivant.
Avec un fichier XSL (eXtensible Stylesheet Langage)
XSL est le langage préférentiel de feuilles de style pour le XML. Beaucoup plus sophistiqué que CSS, il transforme le document XML en HTML avant son affichage par le browser.
Voici le fichier XML brut (Menu.xml)
Voici le fichier XSL associé (Menu.xsl)
Revoici le fichier XML associé au fichier XSL (MenuXSL.xml) par :
<?xml-stylesheet type="text/xsl" href=Menu.xsl"?>
Pas mal non-plus (mais le XSL a fabriqué du HTML)
Avec un fichier HTML

Le tag non-officiel <xml> permet d'insérer du XML dans les pages HTML (Data Island)
1)
Données
explicites
<xml id="note">
<note>
<to>Roméo</to>
<from>Juliette</from>
<heading>Rappel</heading>
<body>Ne m'oublie pas ce week-end !</body>
</note>
</xml>
Notez bien que le tag <xml ... >
n'est pas un élément XML.
2)
Fichier de
données
<xml id="note" src="Note.xlm">
</xml>
 
Les "Data Islands" peuvent être liés aux éléments HTML comme ci-dessous.
1)
Exemple
simple
<html>
<body>
<xml src="Catalog.xml" id="Catal" async="false"> </xml>
<br />Titre :
<span datasrc="#Catal" datafld="TITLE"> </span>
<br />Artiste :
<span datasrc="#Catal" datafld="ARTIST"> </span>
<br />Année
<span datasrc="#Catal" datafld="YEAR"> </span>
</body>
</html>
Les données XML du fichier "Catalog.xml"
sont associées à l'ID "Catal"
async="false" bloque le chargement asynchrone (l'analyseur ne doit pas commencer l'exécution avant que le document soit entièrement chargé).
Chaque balise <span> identifie les données
par un attribut "data source"
et affiche le contenu XML défini
par l'attribut "data field".
2)
Dans un
tableau
<html>
<body>
<xml src="Catalog.xml" id="Catal" async="false"> </xml>
<table border="1" datasrc="#Catal"
<tr>
<td><span datafld="ARTIST"></span></td>
<td><span datafld="TITLE"></span></td>
</tr>
</table>
</body>
</html>
La liaison avec les données XML se fait de la même façon que ci-dessus.
Le tableau HTML est relié aux données
par un attribut "data source"
et les éléments du tableau sont reliés au XML
par un attribut "data field"
dans une balise <span>.
Le résultat est étonnant.

Voici le fichier XML de base (Catalog.xml) déjà vu plus haut
Voici le fichier HTML du premier exemple (Catalog1.html) : bof ! (trop simple !)
Voici le fichier HTML du deuxième exemple (Catalog2a.html) : cool ! (étonnant !)
Voici un fichier HTML avec un tableau plus complet (Catalog2b.html) : trop cool ! (magique non !)
On peut pousser beaucoup plus loin l'association XML, HTML, Scripts avec les navigateurs récents (browser HTML + parser XML).
Avec du JavaScript
Les exemples qui suivent ont été testés avec IE 6.

1)
Charger
un
fichier
XML
 <script type="text/javascript">
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.load("Note.xml")
// ... traitement du document
</script>
La ligne 2 crée une instance du parser XML de Microsoft
La ligne 3 désactive le chargement asynchrone (voir exemple précédent)
La ligne 4 charge le fichier Note.xml
2)
Insérer
du
XML
dans le
document
<script type="text/javascript">
var text="<note>"
text=text+"<to>Roméo</to><from>Juliette</from>"
text=text+"<heading>Rappel</heading>"
text=text+"<body>Ne m'oublie pas ce week-end !</body>"
text=text+"</note>"
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.loadXML(text)
// ... traitement du document
</script>
Noter l'utilisation de la méthode loadXML
à la place de load
3)
Afficher
un
élément
XML
<html>
<body>
<script type="text/javascript">
// voir ouverture du fichier dans l'exemple 1
document.write
("Le premier élément XML du fichier contient : ")
document.write
(xmlDoc.documentElement.childNodes.item(0).text)
</script>
</body>
</html>
La collection
xmlDoc.documentElement.childNodes
permet d'accéder aux éléments XML
du fichier Note.xml
item(0).text affiche le contenu
du premier élément rencontré.
4)
Afficher
un
fichier
XML
connu
<html>
<head>
<script type="text/javascript" for="window" event="onload">
// voir ouverture du fichier dans l'exemple 1
nodes=xmlDoc.documentElement.childNodes
pour.innerText=nodes.item(0).text
de.innerText=nodes.item(1).text
objet.innerText=nodes.item(2).text
contenu.innerText=nodes.item(3).text
</script>
<title>Données XML en HTML</title>
</head>
<body>
<h1>Afficher un fichier XML</h1>
<b>A l'intention de : </b>
<span id="pour"> </span>
<br />
<b>De la part de : </b>
<span id="de"></span>
<hr>
<b><span id="objet"></span></b>&nbsp;: <span id="contenu"></span>
<hr>
</body>
</html>
Les attributs for et event de <script> sont indispensables.
innerText affecte aux ID le contenu des éléments XML.
Ces contenus sont affichés dans les <span>.
5)
Afficher
un
fichier
XML
inconnu
<html>
<body>
<script type="text/javascript">
// voir ouverture du fichier dans l'exemple 1
var xmlMax=
xmlDoc.documentElement.childNodes.length;
document.write("<h1>Afficher un fichier XML</h1>");
for (var i=0; i<xmlMax; i++)
{document.write("<p><b>"+ xmlDoc.documentElement.childNodes.item(i).nodeName + "</b> : ");
document.write
(xmlDoc.documentElement.childNodes.item(i).text+ "</p>");}
</script>
</body>
</html>
La propriété length fournit
le nombre d'éléments XML du fichier
La boucle (for) affiche
le nom (nodeName) et
le contenu (text) de chacun.

Voici le fichier XML pur (Note.xml) : message désabusé de Juliette à Roméo
Voici le fichier HTML de l'exemple 3 (AffNote1.html) : nul ! (j'ai quand même récupéré une donnée !)
Voici le fichier HTML de l'exemple 4 (AffNote2.html) : bof ! (j'ai néanmoins formaté l'affichage !)
Voici le fichier HTML de l'exemple 5 (AffNote3.html) : bah ! (j'ai pourtant affiché le contenu !)
Voici un fichier HTML qui manipule le "recordset" défini par Catalog.xml déjà rencontré (AffCatalog1.html) : bien ! (enfin !)
Voici une autre manipulation (presque sans JavaScript) de Catalog.xml (AffCatalog2.html) : bien grave ! (merci!)

Tutoriel XML
Exemples de fichiers XML
Retour au début