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> : <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!)