Programmation XML-FR
Programmation XML-FR
Programmation XML-FR
Un livre de Wikilivres.
Introduction
XML est l'acronyme d'eXtended Markup Language, soit « langage de balise étendu » en français. XML
permet la structuration et la manipulation de toutes sortes de données dans un format se voulant le plus
indépendant possible des plates-formes et des logiciels.
La technologie XML vise à devenir le standard d'échange principal entre systèmes hétérogènes. XML hérite
de SGML et à ce titre est un cousin de HTML. C'est un langage de balises comme HTML mais extensible et
strict.
À partir de XML, il est possible de dériver des langages spécialisés comme XHTML ou MathML, ou tout
autre langage, et ceci grâce au fait que les noms des balises peuvent être réinventés (étendus) en fonction des
besoins.
Histoire de XML
Donc, le document XML est un format dont nous allons décrire la structure :
Un document XML est constitué de balises. Une balise est une chaîne de caractères constituant un
identificateur et placé entre un caractère < et un caractère >.
Les noms ne peuvent pas commencer par la chaîne de caractères « xml », dans n'importe quelle
combinaison de casse (ou Xml, ou XML…) ;
les noms sont sensibles à la casse (différentiation minuscules/majuscules) ;
les noms ne peuvent pas débuter par un nombre ou un signe de ponctuation ;
les noms ne peuvent pas contenir d'espaces ;
éviter les caractères accentués et les opérateurs, virgules, point-virgules…
Une balise ouvrante est un élément délimitant une section. La section se termine ensuite par une balise
fermante.
Une balise ouvrante est une chaîne composée de chiffres, de lettres et des caractères - et _. Cette chaîne est
comprise entre un < et un >.
Exemple :
<balise>
Une balise fermante reprend l'identificateur de la balise ouvrante, en le précédent d'un caractère « barre de
fraction » (slash). Exemple :
</balise>
Une balise « vide » est le résultat de la contraction d'une balise ouvrante et d'une balise fermante ne
contenant pas de données.
Les attributs
Les balises ouvrantes et les balises vides peuvent être enrichies avec des attributs.
<root>
<item id="67af65c75b" date="22/01/2006">Contenu de l'élément</item>
<break mode="immediat"/>
</root>
Dans l'exemple ci-dessus, la balise ouvrante item est munie de deux attributs, id et date. La balise vide
break est munie de l'attribut mode.
Une instruction de traitement est destinée à être lue et comprise par un programme spécifique, afin de
permettre le traitement du document XML.
Exemple :
Les commentaires
Les commentaires sont des balises qui ne sont pas interprétées par l'application qui traite le document XML.
Un commentaire est une balise commençant par <!-- et terminant par -->.
Exemple :
<!-- Ceci est un commentaire utilisé dans les langages web -->
Les entités
XML 1.0 définit un petit nombre d'entités utilisables dans le document sans nécessiter de déclaration dans le
doctype.
Toujours sans déclaration de doctype spécial, on peut écrire une entité avec « & », « # », une référence
unicode [1] et un « ; ».
Exemple
Les trois constituants de l'en-tête que nous allons décrire ne sont pas obligatoires. Ils sont employés en cas
de besoin pour fixer l'encodage, définir le doctype et/ou associer une feuille de style.
Version, encodage
Il est souhaitable que le document XML commence par l'indication de la version du langage et le jeu de
caractères utilisé. C'est souvent utf-8 [1] . Il est également souhaitable, si le document est stocké sur disque,
que l'encodage du fichier soit le même que celui mentionné par l'attribut encoding…
<!-- ou -->
Référence au DTD
La deuxième information utile est la mention du doctype. Certains documents XML en ont impérativement
besoin, d'autres peuvent s'en passer.
<!DOCTYPE root[
<!ELEMENT root (premier,deuxieme+)>
<!ELEMENT premier (#PCDATA)>
<!ELEMENT deuxieme (#PCDATA)>
]>
Il est possible d'associer un document XML à une feuille de style css ou xsl. Si la fonctionnalité fait
réfléchir, au début, il y a fort à parier que vous en abandonnerez la pratique par la suite. En effet, la
philosophie XML va à l'opposé.
Une balise a un statut spécial, c'est la racine du document XML. C'est à partir de cette balise que se
développe l'arborescence du document.
Le corps d'un document XML est une arborescence d'éléments (balises) imbriqués, avec un élément racine
unique.
<root>
<balise1>
<balise2>
</balise2>
</balise1>
</root>
Quand toutes ces règles sont respectées, on obtient un document XML « bien formé ». Dans ce cas, un
navigateur comme Internet explorer ou Firefox peut l'ouvrir. Dans le cas contraire, le navigateur affiche un
message d'erreur.
Références
1. Unicode est un standard qui permet une représentation abstraite et universelle du texte. Pour découvrir ce sujet,
on pourra lire le wikilivre: À la découverte d'Unicode.
2. http://www.w3schools.com/xml/xml_attributes.asp
Liens
Traduction française de la spécification XML1.1 (http://www.yoyodesign.org/doc/w3c/xml11
/index.html) [archive]
Espace de nom
Les espaces de noms (ou namespace) sont destinés à lever les ambiguïtés éventuelles des intitulés de balise,
au moyen d'un identifiant de ressource unique (URI).
Syntaxe
L'exemple ci-dessous contient deux déclarations, la première par défaut et la seconde associant le préfixe
« ip » à l'URI des adresses IP, pour les distinguer des adresses postales :
<adresse
xmlns="http://www.example.com/adresses_postales"
xmlns: ip="http://www.example.com/adresses_ip">
Nous abordons toutefois les DTD ici, afin que vous puissiez en comprendre une si besoin. Notamment, vous
pourriez être amener à transformer une DTD en un Schema pour utiliser cette nouvelle technologie.
La DTD n'est pas obligatoire. Elle peut être interne au document XML ou bien externe (dans un fichier à
l'extension « .dtd »). On utilise une DTD externe lorsque l'on veut la partager entre plusieurs fichiers XML.
<!DOCTYPE nom-element-racine [
et se termine par :
]>
Éléments
Chaque élément de la DTD est défini de la manière suivante [1] :
un et un seul sous-élément :
<!ELEMENT personne(telephone)>
0 ou plusieurs sous-éléments :
<!ELEMENT personne(telephone*)>
1 ou plusieurs éléments :
<!ELEMENT personne(telephone+)>
0 ou 1 seul élément :
<!ELEMENT personne(telephone?)>
Exemple du stockage d'un répertoire de services. Chaque service a un nom et peut avoir un ou plusieurs
téléphone(s) :
Attributs
Ils sont déclarés avec ATTLIST. Par exemple, on définit un type de paiement par défaut en liquide :
Valeur Explication
value valeur par défaut de l'attribut
#REQUIRED attribut requis
#IMPLIED attribut optionnel
#FIXED value attribut de valeur fixe
Type Description
CDATA valeur de la donnée
(en1|en2|..) valeur dans la liste énumérée
ID identifiant unique
IDREF identifiant d'un autre élément
IDREFS liste d'autres identifiants
NMTOKEN nom d'un XML valide
NMTOKENS liste de noms d'XML
ENTITY entité
ENTITIES liste d'entités
NOTATION nom d'une notation
xml: valeur d'un xml prédéfini
Entités
Déclarer une entité permet de l'intégrer ensuite en appelant son nom précédé d'un et commercial,
pourcentage ou guillemet ('&', '%' ou ' " ' [3] ) et suivi d'un point virgule (';'). Ex :
<b>
&intro;
</b>
Exemple
Extrait du cahier des charges XHTML [4] concernant les hyperliens :
Références
1. http://www.w3schools.com/dtd/dtd_elements.asp
2. http://www.w3schools.com/dtd/dtd_attributes.asp
3. http://xmlwriter.net/xml_guide/entity_declaration.shtml
4. http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
Interprétation du XML
Il existe de nombreuses API permettant d'interpréter un document XML. La plupart sont conçues pour un
langage particulier :
Dom4J (Java)
JDOM (Java)
SimpleXML (PHP)
PyXML (Python) [1]
DOM (créé par le W3C) : un arbre de nœuds complet est construit à partir du document XML.
SAX (créé par David Megginson) : l'interpréteur appelle certaines fonctions de l'application en fonction
de chacun des éléments de base rencontrés dans le document XML (ouvertures de balise, fermetures,
données, commentaires, ...).
Références
1. http://pyxml.sourceforge.net/topics/
Voir aussi
Programmation Python/XML
Programmation Java/XML
SAX
La méthode SAX (Simple API for XML) analyse les éléments XML au fur et à mesure, par opposition au
DOM. Ce qui est plus pratique pour des fichiers de grande taille par exemple.
Voir aussi
Programmation Python/XML#La méthode SAX
Programmation Java/XML#La méthode SAX
DOM
La méthode DOM (Document Object Model) analyse les éléments XML en construisant une arborescence
de la structure d'un document et de ses éléments. Cela nécessite donc de le lire en entier ce qui peut poser un
problème de saturation quand il est de grande taille.
Voir aussi
Programmation PHP/La librairie DOM
XPath
Syntaxe
Le XPath est un langage de sélection de différents types d'objets XML, appelés « nœuds » [1] . Un ensemble
de nœuds est appelé « contexte ».
Sélecteur Notes
nom du nœud Sélectionne ce qui est compris dans le nœud nommé.
/ Sélectionne en partant du nœud racine (chemin absolu).
// Sélectionne en partant du nœud courant, peu importe le reste de l'emplacement.
. Sélectionne à partir du nœud courant (chemin relatif). = self::node()
.. Sélectionne à partir du parent du nœud courant. = parent::node()
@ Sélectionne les attributs. = attribute::
| Opérateur de sélection multiple.
Remarque : Il existe un interpréteur en ligne pour réaliser les exemples décrits ci-dessous :
http://www.xpathtester.com/.
La classe http://www.php.net/manual/fr/domxpath.query.php permet de les programmer.
Ces expressions sont appelées « chemin de localisation », composés d'un ou plusieurs « pas de localisation »
(ou « étapes ») séparés par des « / ». Les pas de localisation ont chacun trois composants :
Axes
Pour décrire les relations entre les nœuds, XPath utilise le vocabulaire suivant :
Tests de nœuds
Soit l'espace de nom ns :
Tests Notes
comment() trouve tous les commentaires (ex : <!-- commentaire 1 -->)
text() trouve un nœud texte, (ex : hello world dans <k>hello<m> world</m></k>)
processing- trouve les instructions de traitement (ex : //processing-instruction('php')
instruction() trouve <?php echo $a; ?>)
Prédicats
Les prédicats sont des fonctions filtrant les nœuds évalués à false, qui se placent à la fin des sélections [3] :
Par exemple, les quatre requêtes ci-dessous renvoie le même résultat (si la branche 2 est la dernière comme
dans l'exemple en bas de cette page) :
//branche[2]
//branche[@nom="branche2"]
/tronc/branche[last()]
/tronc/branche[position()=2]
Prédicats Notes
last() renvoie le dernier nœud de la sélection
position() renvoie le nœud situé à la position précisée
count(contexte) renvoie le nombre de nœuds en paramètre
starts-with(chaine1,
renvoie true si le premier argument commence avec le second
sous-chaine2)
Exemples
Soit l'arborescence suivante :
Abréviations
Sélection 1 : toutes les <feuille> d'une <brindille> contenue dans une <branche>, descendant du <tronc>,
issu de la racine.
1. Abrégé : /tronc/branche/brindille/feuille
2. Non abrégé : /child::tronc/child::branche/child::brindille/child::feuille
Sélection 2 : la <branche> dont l'attribut "nom" est "branche3", enfant du <tronc>, inclue dans la racine.
1. Abrégé : /tronc/branche[@nom='branche3']
2. Non abrégé : /child::tronc/child::branche[attribute::nom='branche3']
Sélection 3 : toutes les brindilles ont au moins une feuille.
1. //brindille[feuille]
Sélection 4 : dernière branche du tronc.
1. //tronc/branche[last()]
Sélection 5 : tous les noms des brindilles qui n'ont pas de feuille.
1. //brindille[not(feuille)]/@nom
PHP
<?php
$file = 'tronc.xml';
$xpath = "/tronc/branche/brindille/feuille[last()]";
if(file_exists($file)) {
$xml = simplexml_load_file($file);
if($result = $xml->xpath($xpath)) {
print 'Résultats :';
var_dump($result);
} else {
echo 'Syntaxe invalide.';
}
}
else
exit("Le fichier $file n'existe pas.");
?>
eXist ou BaseX
Références
1. http://www.w3schools.com/dom/dom_nodetype.asp
2. http://www.w3schools.com/xpath/xpath_syntax.asp
3. http://www.w3.org/TR/xpath#corelib
Voir aussi
http://b3d.bdpedia.fr/query.html#s1-xpath-trouver-son-chemin-xml : explications avec vidéo en français
XSLT
Syntaxe de base
XSLT signifie Extended Stylesheet Language Transformations. Il s'agit d'un langage qui permet de
transformer un document XML en un autre format en s'appuyant sur XPath. On peut par exemple créer une
page HTML, un fichier PDF ou autre à partir d'un fichier XML.
Le langage XSLT se base sur la notion de règles de transformation. Pour chaque balise XML, on définit
comment son contenu doit apparaitre dans le document produit. Ces règles sont dans des balises <xsl: et on
les enregistre dans des documents .xsl.
Attributs
Attributs Note
match désigne le nœud auquel s'applique le code.
select ce qu'il faut trier dans le résultat.
order classe les résultats (ascending ou descending)
classe les résultats en distinguant les lettres capitales (upper-first ou
case-order
lower-first)
Exemple
PHP
Depuis PHP5 l'extension est déjà inclue [1] dans le fichier PHP.ini :
extension=php_xsl.dll
Il n'y a donc rien a installer pour charger les deux fichiers publiés ci-dessus :
<?php
$XML = new DOMDocument();
$XML->load('note.xml');
print $xslt->transformToXML($XML);
?>
Syntaxe avancée
Éléments
Éléments
Description Catégorie
XSL [2] [3]
apply-imports Applies a template rule from an imported stylesheet instruction
apply-templates Applies a template rule to the current element or to the instruction
current element's child nodes
attribute Adds an attribute instruction
attribute-set Defines a named set of attributes top-level-element
call-template Calls a named template instruction
choose Used in conjunction with <when> and <otherwise> to instruction
Éléments
Description Catégorie
XSL [2] [3]
preserve-space Defines the elements for which white space should be top-level-element
preserved
processing- Writes a processing instruction to the output instruction
instruction
sort Sorts the output instruction
strip-space Defines the elements for which white space should be top-level-element
removed
stylesheet Defines the root element of a stylesheet top-level-element
template Rules to apply when a specified node is matched top-level-element
text Writes literal text to the output instruction
transform Defines the root element of a stylesheet top-level-element
value-of Extracts the value of a selected node instruction
variable Declares a local or global variable top-level-element or
instruction
when Specifies an action for the <choose> element instruction
with-param Defines the value of a parameter to be passed into a template instruction
Fonctions
Fonctions chaines
Example:
string(314)
Result: '314'
Fonctions nombres
Fonctions booléennes
Example:
number(false())
Result: 0
Example:
number(true())
Result: 1
Références
1. http://www.php.net/manual/fr/book.xsl.php
2. http://www.w3schools.com/xsl/xsl_w3celementref.asp
3. http://www.w3.org/TR/xslt#element-syntax-summary)
4. http://www.w3schools.com/xsl/xsl_functions.asp
5. http://www.w3schools.com/xsl/xsl_functions.asp
Voir aussi
CSS
XML Schema
Syntaxe
XML Schema est un langage de description de format, permettant de définir la structure et le type de
contenu d'un document XML (comme pour créer une base de données).
Ces règles sont dans des balises <xs: ou <xsd: et on les enregistre dans des documents .xsd (XML Schema
Definition).
Exemple
<xsd:complexType name="Type_de_genre">
<xsd:sequence>
<xsd:element name="nom" type="xsd:string"/>
<xsd:element name="description" type="xsd:string"/>
<xsd:element name="film" type="Type_de_film" minOccurs="1" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<!-- Type_de_film est un enfant de Type_de_genre qui l'appelle par son nom -->
<xsd:complexType name="Type_de_film">
<xsd:sequence>
<xsd:element name="nom" type="xsd:string"/>
<xsd:element name="acteur" type="Type_d_acteur" minOccurs="1" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<!-- Exemple de restriction en regex -->
<xsd:simpleType name="Type_d_adresse_email">
<xsd:restriction base="xsd:string">
<xsd:pattern value="[^@]+@[^\.]+\..+"/>
</xsd:restriction>
</xsd:simpleType>
Voir aussi
Catégorie:Expressions rationnelles
XLink
XPointer
XForms
XQuery
XQuery est une recommandation W3C de sélection de données depuis des documents et bases de données
basée sur XML.
Sommaire
1. Introduction
2. Installation
Exemples basiques
1. HelloWorld
2. Chargement de données
3. Expression FLWOR
4. Séquences
5. Analyse syntaxique CSV
6. Exemples XPath
7. Expressions rationnelles
8. Searching multiple collections
9. Getting URL Parameters
10. Getting POST Data
11. Checking for Required Parameters
12. Displaying Lists
13. Extracting data from XHTML files
14. Displaying data in HTML Tables
15. Limiting Result Sets
16. Filtering Words
17. Saving and Updating Data
18. Quantified Expressions
19. Dates and Time
20. Chaining Web Forms
Exemples intermédiaires
Recherche
5. Employee Search
6. Incremental Search of the Chemical Elements
7. Lucene Search
8. Incremental Searching
9. Advanced Search
10. Open Search
11. Auto-generation of Index Config Files
Interaction
1. Adder
2. Simple XForms Examples
3. Navigating Collections
4. Envoyer des e-mails
Vues personnalisées
1. Transformation Styles
2. Typeswitch Transformations
3. Transformation idioms
4. Generating Skeleton Typeswitch Transformation Modules
5. Web XML Viewer
Rapports paginés
1. Installing_the_XSL-FO_module
2. Generating PDF from XSL-FO files
3. XSL-FO Tables
4. Converting HTML tables to XSL-FO tables
5. XSL-FO Images
Publication de contenu
1. Publishing Overview
2. Publishing to Subversion
Documents
1. TEI Concordance
2. TEI Document Timeline
3. DocBook to HTML
4. DocBook to PDF
5. DocBook to ePub
6. DocBook to Microsoft Word
7. OpenOffice to HTML
8. Office Open XML
XML Schemas
Virtualisation
1. Graph Visualization
2. Graphing from RDF
3. Dataflow diagrams
4. Sequence Diagrams
5. Example Sequencer
1. Google Charts
2. Google Chart Sparkline
3. Google Chart Bullet Bar
4. Histogram of File Sizes
Page Scraping
Mapping
1. Google Geocoding
2. String Analysis#Location_Mapping
3. Flickr GoogleEarth
4. Nationalgrid and Google Maps
5. SMS tracker
Timelines
1. Creating a Timeline
2. Timelines of Resource
3. TEI Document Timeline
Web sémantique
Outils de développent
Validation
1. Validating a document
2. Validation using a Catalog
3. Validating a hierarchy
4. Validation with Schematron
Path Analysis
1. All Paths
2. All Leaf Paths
Securité
1. XUnit Testing
2. XUnit Annotations
Études de cas
1. Fizzbuzz
2. Project Euler
3. Topological Sort
4. Slideshow
5. Sudoku
6. Pachube feed
7. World Temperature records
8. UWE StudentsOnline
Modules eXistdb
Annexes
1. DataDirect XQuery
2. Microsoft SQL Server 2005
3. NetKernel
4. Oracle Berkeley DB XML
5. Stylus Studio
6. XQilla
7. Gotchas
8. Ah-has
Références
Tout ou partie de cette leçon est issu de la traduction d'une page sous licence GFDL
« anglais Programmation XML » .
WML
XSL-FO
Introduction à XSL-FO
L'objectif de XSL-FO est de créer un arbre d'aires où une aire est une zone d'affichage (visuelle ou auditive).
XSL-FO fournit l'ensemble des commandes de contrôle de chaque aire : présentation du contenu, direction
de l'empilement (écriture de gauche à droite ou inversement, de haut en bas...).
Ces commandes sont dans des balises <fo: et on les enregistre dans des documents .xfo, .fo ou .fob.
<fo:layout-master-set>
<fo:simple-page-master master-name="A4">
<fo:region-body />
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="A4">
<fo:flow flow-name="xsl-region-body">
<fo:block>Hello world</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
Format du tableau :
------------------------------------ --
| | 1
| ------------------------ | --
| | | | 2
| ------------------------ | --
| | | | | | 3
| | | ------- | | | --
| | | | | | | | 4
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | ------- | | | --
| | | | | | 5
| ------------------------ | --
| | | | 6
| ------------------------ | --
| | 7
------------------------------------ --
| 1 | 2 | 3 | 4 |5| 6 | 7 |
Region-body
region viewport area
___ ___
region-after
region viewport area
I margin-
bottom
Références
1. http://www.w3schools.com/xslfo/xslfo_output.asp
Liens externes
La dernière vérification concernant les liens externes a été effectuée le le 25 janvier 2006.
FOP est une application Java qui accepte un document FO et génère une page dans différents
formats : PDF, PCL, PS, SVG, XML, Print, AWT, MIF and TXT. Le principal format de sortie
étant le PDF.
SOAP
XML Signature
SMIL
SVG
MusicXML
SyncML
Objectifs
Après avoir lu ce chapitre, vous serez capable de :
Introduction
Les terminaux mobiles comme les PDA, les pagers, les téléphones mobiles et les ordinateurs portables ne
sont par nature pas connectés en permanence à un réseau. Cependant, ces appareils contiennent des
applications qui ont besoin d'informations provenant d'un réseau afin d'être utilisables. La plupart des PDA
et mobiles possèdent des applications comme des calendriers, des listes de taches, des répertoires pour
stocker des informations qui deviennent moins utiles à partir du moment où elles sont statiques, uniquement
disponibles sur l'appareil. Par exemple, des copies statiques d'informations seront différentes de l'original
dès qu'une modification est apportée d'un côté ou de l'autre. La synchronisation offre la possibilité à un
terminal de se connecter à un réseau afin de mettre à jour à la fois l'information de l'appareil et l'information
du réseau pour que les deux soient identiques et à jour.
Devant la prolifération d'appareils mobiles et de protocoles propriétaires ainsi que la demande croissante
d'accès à de l'information en situation de mobilité, les sociétés leader sur le domaine ont compris l'intérêt de
créer un langage standard et universel décrivant les actions de synchronisation entre les terminaux et les
applications. Elles ont formé un consortium pour sponsoriser cette initiative et pour créer ce langage.
SyncML comprend des commandes client et serveur définies par des DTD...
Principes de SyncML
Vocabulaire
effectuées par un client ou un serveur SyncML. Un package est un ensemble d'actions à effectuer.
Message - La plus petite unité de balise SyncML. Les grands packages sont découpés en messages
séparés.
Mapping - Utilisation d'un identifiant intermédiaire pour lier deux informations. Exemple : Disons que
'vert' c'est '5', et '5' c'est bien. Qu'est-ce qui est bien ? Si vous répondez 'vert', vous êtes tombé juste. vous
avez réalisé un mapping !
Abréviations :
IMEI International Mobile Equipment Identifier - numéro d'identification des terminaux mobiles
GUID Global Unique Identifier - identifiant global unique
LUID Local Unique Identifier - identifiant local unique
Messages et Packages
Un message est un ensemble de commandes SyncML transmises (en une seule fois) vers le client ou le
serveur. La taille maximale d'un message est définie par la Meta données MaxMessageSize. Si un message à
transmettre dépasse cette taille on le découpe en plusieurs messages. On parle alors de Multiple Message in
Package. Un package correspond à un ensemble de messages pour effectuer une des étapes de la
synchronisation. Les packages sont les suivants: pkg1 = initialisation du client (authentification, échange des
devinf, des informations sur les bases à synchroniser), pkg2 = initialisation du serveur, pkg3 = modification
côté client, pkg4 = modification côté serveur, pkg5 = mise à jour des données et statuts, pkg6 = mapping des
id client et serveur.
Comme SOAP, il y a deux parties dans un message SyncML, un en-tête <SyncHdr> et un corps
<SyncBody>. L'en-tête contient des meta-informations sur la requête comme la base de données cible
<Target> et la base de données source <Source>, les informations d'authentification <Cred>, l'identifiant de
session <SessionID>, l'identifiant du message <MsgID>, et la déclaration de la version de SyncML
<VerDTD>. Le corps contient les commandes SyncML (les statuts des commandes du message précédent, et
toutes les autres commandes prévues par SyncML).
Adressage
L'adressage est réalisé au travers des balises <Source> et <DocURI>. Un serveur aura une URI du genre
http://www.chris.syncml.org/sync et le terminal mobile client aura un numéro d'identification IMEA comme
ceci 30400495959596904.
Mapping ou Correspondance
SyncML est basé sur l'idée que les clients et les serveurs peuvent avoir leur propre méthode pour faire
correspondre les informations dans leur base de données. Aussi, les clients et les serveurs doivent avoir leur
propre ensemble d'identifiants uniques.
En effet, par gain de place, certain terminaux mobile ne peuvent accepter des id trop longs, ils vont alors
définir leur propres id, et envoyer au serveur le mapping à effectuer à l'aide de la balise <Map>. De cette
manière, le mobile ne stocke que l'id qu'il a choisi (généralement assez court) et le serveur, lui, stocke les
deux, ce qui lui permet de s'adresser au mobile avec l'id que le mobile connait. Le serveur conserve
l'ensemble des id indéfiniment.
Dans les futurs échanges, le mobile utilisera seulement l'id qu'il connait, et le serveur se chargera d'effectuer
les mappings correspondants.
Les identifiants locaux uniques (LUID - Locally Unique Identifiers) sont des nombres assignés par le
client à une donnée dans la base de données locale (comme un champ ou une ligne). Ce sont des nombres
non réutilisables assignés à ces objets par le client SyncML.
Les identifiants globaux uniques (GUID - Globally Unique Identifiers) sont des nombres assignés à une
donnée utilisés dans une base de données distante. Cet identifiant est assigné par le serveur.
Le serveur va créer une table de correspondance pour lier les LUID et GUID ensemble.
LUID Data
---- ----
5 Green
GUID Data
---- ----
5050505 Green
GUID LUID
---- ----
5050505 5
Les change logs sont une manière pour un device (client ou serveur) de déterminer la liste des modifications
dans la base depuis la dernière synchro.
Les ancres
Les ancres servent à savoir si la dernière synchro s'est bien passée. Au début de session, le client envoie ses
ancres (last et next). Le serveur stock la next du client. À la fin de la session (s'il n'y a pas eu d'interruption),
le client met à jour ses ancres (last = next et il incrémente next). Lors de la prochaine session, le client
envoie son next et last. Le serveur vérifie que le last du client vaut le next qu'il a stocké précédemment. Si
c'est le cas, c'est OK, on continue. Sinon, cela ne va pas du tout et le serveur PEUT forcer une slow sync.
Session 1 : C'est une slow sync : le client envoie juste son next. La synchro se passe nickel
Client Serveur
|---------next=1------------>| next client = 1
|
|
|
|
Client Serveur
|--------last=1, next=2------>| last = next stocké (1). next client devient 2
| |
|
Interruption
Client Serveur
|------last=1, next=2------>| CA MATCH PAS : 1!= 2 La dernière synchro s'est mal passé
|
En comparant les ancres envoyées et celles stockées avec le type de synchronisation demandé, le serveur
peut déterminer quel est l'information la plus récente. Par exemple, il est possible de réécrire une
information 'nouvelle'- c'est l'information pour laquelle l'empreinte temporelle est la plus récente dans les
logs- avec une information plus ancienne. Cela peut être fait en choisissant une synchronisation dans
laquelle le client dit au serveur d'effacer ses informations avec les données client. Cette opération est appelée
'refresh sync from client'. Les différents types de synchronisation sont décris ci-dessous.
Synchronisations (Syncs)
Dans sa version 1.1, le langage SyncML définit 7 types de synchronisation. La section ci-dessous définit ces
différents types :
Initialisation de la synchronisation
L'initialisation de la synchronisation est un passage obligatoire pour le client et le serveur avant d’entamer
une synchronisation. La première étape est que le client et serveur parlent le même langage, en s'échangeant
l'un et l’autre leur capacité (définies par le matériel, comme la quantité de mémoire, et le protocole définit
par la DTD). La seconde étape est l'identification des bases de données à synchroniser. Ensuite, les deux
doivent décider du type de synchronisation. La troisième et dernière partie est l'authentification. Une fois
que cette étape à été complétée avec succès, la synchronisation à proprement parler peut commencer.
Authentification
Le serveur SyncML peut envoyer au client un message contenant la balise <Chal> qui représente une
demande d'authentification (Challenge en anglais) pour les informations auxquelles le client tente d'accéder.
Le client doit alors répondre et donner le login et mot de passe dans une balise <Cred> (Credential en
anglais).
SyncML peut utiliser l'accès authentifié par le hachage md5. Le client et le serveur échangent leurs
identifiants durant la phase d'authentification, retournant un code d'erreur si le processus s'arrête quelque
part. La balise <Cred> est utilisée dans le <SyncHdr> pour fixer le type d'authentification qui sera utilisé
dans la phase d'authentification. (Il y a le hashage md5, mais aussi l'encodage base64 et d'autres... Il faut
donc que le serveur informe le client du type d'authentification utilisée).
Syntaxe SyncML
Exemple SyncML
1 <SyncML>
2 <SyncHdr>
3 <VerDTD>1.1</VerDTD>
4 <VerProto>SyncML/1.1</VerProto>
5 <SessionID>104050403</SessionID>
6 <MsgID>5</MsgID>
7 <Cred>...</Cred>
8 </SyncHdr>
9 <SyncBody>
10 <Status>...</Status>
11 <Sync>
12 <Target>target database URI</Target>
13 <Source>source database URI</Source>
14 <Add>datafield and data</Add>
15 <Replace>an existing data field with some data</Replace>
16 </Sync>
17 </SyncBody>
18 </SyncML>
Notez que la ligne {1} et {18} débutent le fichier SyncML par la balise racine. Ensuite, le SyncHdr est
définit par les ligne {2} et {8}. Puis les ligne {3,4} qui définissent des informations concernant la version de
SyncML utilisée, la ligne {5} définit l'identifiant de session (sessionID) qui permet d'identifier de façon
unique le dialogue qui est en cours entre le client et le serveur, la ligne {6} représente l'identifiant du
message (MsgID) qui permet d'identifier de façon unique cet ensemble de requêtes (toutes ces balises) qui
vont être exécutées par l'application réceptrice. À la ligne {7}, on trouve la balise Cred (demande
d'authentification, non détaillée ici) qui fait également partie de l'entête. La ligne {8} est la fermeture du
SyncHdr (entête).
Le SyncBody (Corps du message) commence à la ligne {9}. Dans cette partie du message SyncML, on
trouve : le status de l'application/l'appareil {10}, la source et cible de la requête (source/target) {12,13}, et
les actions demandées comme la synchronisation elle-même entre les ligne {11,16}. Aux lignes {14,15}, on
peut voir les commandes Add et Replace qui commandent respectivement l'ajout et le remplacement de
données dans la base de donnée cible.
WBXML et SyncML
WAP Binary XML (WBXML) est une forme de XML dans laquelle les tags sont abrégés dans le but de
raccourcir les balises pour la transmission vers des périphériques mobiles. En effet, ces périphériques ont en
général une bande passante et une mémoire limitées. Les tags XML sont encodés en binaire pour
Ce qui suit est du code binaire WBXML représentant un message SyncML. Notez que sur la première ligne
il y a le définition du type de document, représentée ici en hexadécimal. Regardez ce qui est arrivé à la
chaine suivante "//SYNCML//DTD SYNCML 1.1//EN"
Immédiatement après cette chaîne, on trouve les caractères '6D 6C 71'. Chacun d'entre eux représente un tag
SyncML
Abréviations wbxml
6D = "<SyncML>"
6C = "<SyncHdr>"
71 = "<VerDTD>"
1 <SyncML>
2 <SyncHdr>
3 <VerDTD>1.1</VerDTD>
Donc on peut voir que la syntaxe WBXML este plus compacte que XML, économisant du réseau pour les
appareils mobiles.
Pour plus d'information, voir les articles de Ed Dumbill's sur syncML avec WBXML :
Spécifications de SyncML
La meilleure source d'informations sur SyncML c'est le protocole lui-même. Allez voir le site de l'Open
Mobile Alliance pour obtenir les spécifications de SyncML.
l'Open Mobile Alliance a publié une boîte à outils en C pour implémenter SyncML. Vous pouvez l'obtenir
ici (http://sourceforge.net/projects/syncml-ctoolkit/) [archive]. Si vous comprenez l'allemand, vous pouvez
obtenir un exemple d'application utilisant cette boîte à outils ici (http://www.misterm.de/diplom
/index.html) [archive].
Funambol
Si vous êtes intéressé par le développement d'application basée sur SyncML en Java, regardez le projet open
source Funambol (https://www.forge.funambol.org/) [archive]. Il propose une bibliothèque de classes Java
mettant en œuvre le protocole de synchronisation de données SyncML, un framework Java pour construire
des applications serveurs SyncML et un serveur SyncML indépendant.
Exercice
Exercices
Visiter le site de l'Open Mobile Alliance [1] , et télécharger le PDF du protocole SyncML v. 1.1 pour
répondre à ces questions :
Solution (cliquez)
Références
1. http://technical.openmobilealliance.org/Technical/technical-information/release-program/current-releases
/syncml-archive
Dumbill, E.(2003, March 1). XML Watch: WBXML and basic SyncML server
requirements. IBM.com. Retrieved April 6, 2004 from
http://www-106.ibm.com/developerworks/xml/library/x-syncml2.html
Open Mobile Alliance (2002, April 2). SyncML version 1.0, 1.1 specification, white
paper, errata. Retrieved April 6, 2004 from
http://www.openmobilealliance.org/tech/affiliates/syncml/syncmlindex.html
MathML
MathML est l'utilisation du formalisme XML pour décrire des formules mathématiques.
Il s'agit bien de description de contenu et non pas de mise en forme ; cela permet de faire varier le rendu
selon une feuille de style, et notamment selon des préférences nationales. Par exemple, le vecteur « V » sera
noté <ci type="vector">V</ci>, et pourra être rendu V pour un anglo-saxon et pour un français [1]
(http://www.w3.org/TR/2003/REC-MathML2-20031021/chapter5.html#mixing.notsheet).
Enjeu
La notation mathématique est complexe. Il existe déjà des langages permettant de représenter les
mathématiques, comme LaTeX. L'enjeu ici est, outre de permettre un rendu correct à l'affichage et à
l'impression, de permettre d'utiliser les données par d'autres programmes.
Ainsi, une équation écrite en MathML pourrait être reprise par un solveur qui en donnerait les solutions, ou
bien par un traceur qui en dessinerait le graphe, ou encore par un navigateur vocal pour malvoyant.
Format de fichier
Le fichier contenant le code MathML doit contenir la déclaration de type de document (DTD) suivante [2]
(http://www.w3.org/TR/2003/REC-MathML2-20031021/appendixa.html) :
<!DOCTYPE math
PUBLIC "-//W3C//DTD MathML 2.0//EN"
"http://www.w3.org/Math/DTD/mathml2/mathml2.dtd" >
pour du MathML 2.0. Si le code est inclus dans du HTML, on peut utiliser une DTD HTML étendue au
MathML :
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN"
"http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd" >
Le code MathML est introduit par la balise <math> et est conclu par la balise </math>. Lorsque le code
MathML est à l'intérieur d'un document XML contenant d'autres types de données, il faut s'assurer de la
bonne gestion de l'espace des nom en utilisant la balise d'ouverture <math xmlns="http://www.w3.org
/1998/Math/MathML">. Pour éviter les confusions de balises, on peut imposer un préfixe à toutes les balises
MathML. Par exemple, si l'on veut imposer le préfixe m:, on utilise (exemple de HTML) :
<body xmlns:m="http://www.w3.org/1998/Math/MathML">
<m:math>
<m:mrow>…</m:mrow>
</m:math>
</body>
ou bien
<math xmlns:m="http://www.w3.org/1998/Math/MathML">
<m:mrow>…</m:mrow>
</math>
Description de présentation
<mrow>
<msup>
<mfenced>
<mrow>
<mi> a </mi>
<mo> + </mo>
<mi> b </mi>
</mrow>
</mfenced>
<mn> 2 </mn>
</msup>
</mrow>
On a donc :
les identifiants (par exemple les noms de variables, qui sont des textes et symboles devant être affichés tels
quels), sont encadrés par les balises <mi>…</mi> (math identifier) [3] (http://www.w3.org/TR/2003
/REC-MathML2-20031021/chapter3.html#presm.mi) ;
les opérateurs sont encadrés par les balises <mo>…</mo> (math operator) [4] (http://www.w3.org/TR/2003
/REC-MathML2-20031021/chapter3.html#presm.mo) ;
les nombres sont encadrés par les balises <mn>…</mn> (math number) [5] (http://www.w3.org/TR/2003
/REC-MathML2-20031021/chapter3.html#presm.mn) ;
les expressions devant être considérées comme un groupe sont encadrées par <mrow>…</mrow> (math row)
[6] (http://www.w3.org/TR/2003/REC-MathML2-20031021/chapter3.html#presm.mrow) ;
mfenced qui fournit un encadrement, des parenthèses en l'occurrence ;
msup qui accepte contient deux sous-éléments : la base (ici, « (a + b) ») et l'exposant (ici « 2 »).
(a+b)² <mrow>…</mrow>
│ │
xy <msup>…</msup>
│ │
┌┴──┐ ┌─────┴─────────┐
(…) │ <mfenced>…</mfenced> │
┌┴┬┐ │ ┌────────┼────────┐ │
│ ││ │ │ │ │ │
a + b 2 <mi> a </mi> <mo> + </mo> <mi> b </mi> <mn> 2 </mn>
Description de contenu
<mrow>
<apply> <power/>
<apply> <plus/>
<ci> a </ci>
<ci> b </ci>
</apply>
<cn> 2 </cn>
</apply>
</mrow>
On remarque que l'on utilise ici la notation polonaise (notation préfixée), de type :
(^ (+ a b) 2)
On a :
les balises <apply>…</apply> qui signifient « applique l'opérateur (le premier élément) aux éléments
suivants » ;
les balises d'opérateur, qui sont des balises sans fermeture : <power /> pour l'élévation à la puissance et
<plus /> pour l'addition ;
les balises qui indiquent la fonction d'éléments : <ci>…</ci> pour les identifiants et <cn>…</cn> pour les
nombres.
(^ (+ a b) 2) <mrow>…</mrow>
╽ ╽
(^…) <apply><power/>…</apply>
╽ │
┏━┵━┓ ┏━┵━━━━━━┓
(+…) │ <apply><plus/>…</apply> │
┏┹┓ ╽ ┏━━━━━┵─━━━┓ ╽
┃ ╽ ╽ ┃ ┃ ┃
a b 2 <ci> a </ci> <ci> b </ci> <cn> 2 </cn>
La description de présentation est plus proche des langages orientés impression comme LaTeX ; cela permet
de transposer facilement les formules. La description de contenu permet une interprétation facile de la
formule en tant que telle. Si nécessaire, on peut mélanger les deux types de description, à condition d'être
rigoureux :
dans une description de présentation, un élément de contenu devrait être un fragment ayant un sens pris
isolément ;
dans une description de contenu, un élément de présentation devrait être à l'intérieur d'un élément de
caractère (un « jeton ») de type variable ou nom de fonction.
Éléments
Comme en HTML, et en général en XML, ce qui est compris entre une balise d'ouverture et une balise de
fermeture est appelé un « élément ». On distingue trois types d'éléments :
Voir aussi
VoiceXML
X3D
XMI
XUL
XUL, pour XML-based User interface Language, est un langage de description d'interfaces graphiques
fondé sur XML créé dans le cadre du projet Mozilla.
XUL
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<box>
<description>Hello world!</description>
</box>
</window>
HTML
<html>
<body>
<p>
Hello World!
</p>
</body>
</html>
Références
==
Récupérée de « https://fr.wikibooks.org/w/index.php?title=Programmation_XML/Version_imprimable&
oldid=440121 »