Services Web - EPSI POE mars 2017 - David Gayerie Licence Creative Commons

L'Extensible Markup Language (XML) est un langage de balisage générique. Il permet de représenter des données de manière arborescente (ou sous la forme d'un graphe en utilisant des références XML).

Le XML ne définit pas de balise mais simplement une façon de présenter un document afin qu'il soit bien formé (well-formed). Le XML est défini par la recommandation du W3.

Structure du langage

Le XML est composé par des noeuds (XML Nodes) reliés entre eux sous une forme arborescente. Un noeud ne peut donc avoir au plus qu'un seul noeud parent et, dans un document, un seul noeud n'a pas de parent : il s'agit du noeud racine (root node).

Il existe différents types de noeuds XML :

Element
Un élément sera représenté dans le document par une balise. Un noeud racine est obligatoirement de type élément. Seuls les noeuds de type élément peuvent avoir des fils (i.e. être parent d'un autre noeud)
Attribute
Un attribut permet d'associer une valeur à un élément
Text
Un simple fragment de texte
Processing instruction
Une portion contenant des instructions traitables par une application et délimitée par <? ?>

Structure du document

Un document XML est un document texte qui peut optionnellement commencer par le prologue suivant :


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

On précise ainsi la version du langage XML et l'encodage du document.

Un élément est représenté par une balise. Attention en XML, une balise doit obligatoirement être fermée !

Un balise sans corps

<myelement/>

Un balise avec un corps

<myelement></myelement>

Un attribut est positionné sur la balise ouvrante représentant l'élément.

Un balise avec attribut

<myelement myattr="value"/>

En XML, un attribut a obligatoirement une valeur (qui peut être une chaîne de caractères vide) et cette dernière est obligatoirement délimitée par ' ou ".

En XML, les caractères & ' " < > sont des caractères réservés et doivent être échappés par les entités XML &amp; &apos; &quot; &lt; &gt;.

Un document XML qui respecte les règles de structure du langage et d'un document est dit bien formé (well-formed).

Exercice : XML bien formé

Les exemples de documents XML ci-dessous sont-ils bien formés ? Et si non, pourquoi.


<cours>
  <intitulé>Web services</intitulé>
  <enseignant>D. Gayerie</enseignant>
</cours>


<?xml version="1.0" encoding="utf-8"?>
<cours>
  <code id="I4WS">
  <intitulé>Web services</intitulé>
  <enseignant>D. Gayerie</enseignant>
</cours>


<cours>
  <intitulé>Génie logiciel</intitulé>
</cours>
<cours>
  <intitulé>Web services</intitulé>
</cours>


<test>
  <question>Ce document est-il valide ?</question>
  <exemple>
  <![CDATA[
  <document></DOCUMENT>
  ]]>
  </exemple>
</test>

Espaces de noms XML

Un élément ou un attribut d'un document XML peut être associé à un espace de nom. Un espace de nom XML (XML namespace) est identifié par une URI. Un espace de nom est déclaré grâce à l'attribut xmlns.

Déclaration d'un espace de nom XML

<programme xmlns="http://epsi.fr/syllabus">
  <cours code="I4GL">
    <intitulé>Génie logiciel</intitulé>
  </cours>
  <cours code="I4WS">
    <intitulé>Web services</intitulé>
  </cours>
</programme>

Un espace de nom XML s'applique à l'élément portant l'attribut xmlns et à tous les éléments fils.

Il est possible de mélanger dans un même document XML des éléments appartenant à des espaces de noms différents.

Document XML contenant plusieurs espaces de nom

<html xmlns="http://www.w3.org/1999/xhtml">
  <body>
    <h1>Exemple MathML</h1>
    <math xmlns="http://www.w3.org/1998/Math/MathML">
      <mrow>
        <mroot>
          <mrow><mi>b</mi></mrow>
          <mrow><mn>3</mn></mrow>
        </mroot>
      </mrow>
    </math>
  </body>
</html>

Afin de résoudre les cas ambigus, un espace de nom peut être identifié par un préfixe.

Document XML contenant plusieurs espaces de nom avec un préfixe

<h:html xmlns:h="http://www.w3.org/1999/xhtml"
        xmlns:ma="http://www.w3.org/1998/Math/MathML">
  <h:body>
    <h:h1>Exemple MathML</h:h1>
    <ma:math>
      <ma:mrow>
        <ma:mroot>
          <ma:mrow><ma:mi>b</ma:mi></ma:mrow>
          <ma:mrow><ma:mn>3</ma:mn></ma:mrow>
        </ma:mroot>
      </ma:mrow>
    </ma:math>
  </h:body>
</h:html>

L'espace de nom sans préfixe est appelé l'espace de nom par défaut (default XML namespace).

Ainsi, un élément XML est défini par :

Son nom
Le nom apparaît dans la balise du document.
Exemple : body
Son espace de nom
L'espace de nom est donné par l'attribut xmlns de l'élément, un préfixe ou est hérité de l'élément parent.
Exemple : http://www.w3.org/1999/xhtml
Son nom qualifié (qualified name ou QName)
L'association de l'espace de nom et du nom de l'élement. Il s'agit en fait du nom complet de l'élement.
Exemple : {http://www.w3.org/1999/xhtml}:body

schémas XML

Un document XML est valide (valid) si le QName et l'ordre des éléments sont conformes à un document de validation.

Un schéma XML (XSD) permet d'écrire un document de validation au format XML.

Exemple de schéma XML

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:tns="http://epsi.fr/syllabus" 
        targetNamespace="http://epsi.fr/syllabus"
        elementFormDefault="qualified">
  <element name="programme">
    <complexType>
      <sequence>
        <element name="cours" type="tns:typeCours" 
         maxOccurs="unbounded" minOccurs="0"/>
      </sequence>
    </complexType>
  </element>
  <complexType name="typeCours">
    <sequence>
      <element name="intitulé" type="string" 
       maxOccurs="1" minOccurs="1"/>
    </sequence>
    <attribute name="code" type="string"/>
  </complexType>
</schema>

Pour aller plus loin...

XML
http://www.w3schools.com/xml/
XML namespace
http://www.w3schools.com/xml/xml_namespaces.asp
XML schema
http://www.w3schools.com/schema/