Accueil > XML, XSD > Jouer avec le XML – partie 1 – Présentation

Jouer avec le XML – partie 1 – Présentation

Voici le premier billet concernant une petite série autour du XML et des XSD.

Dans le premier et présent billet, je ferais un (bref) récapitulatif sur ce qu’est le XML et l’usage du XSD (dépurvu de C#, donc).
Dans le second, nous verrons l’usage des XSD en C#, avec l’outil XSD.exe.
Dans un troisième temps, comment utiliser les attributs XML pour sérialiser en XML une classe.
Et dans une dernière partie, tout ce que je n’ai pas pu caser dans les parties précédentes🙂

Le but, pour moi, est de compiler ici toutes les informations que je dois chercher à chaque fois que je travaille avec du XML, car ne l’utilisant pas assez souvent pour que ça rentre, mais quand même sur chaque mission.
Du coup, ce n’est pas forcément complet ou trop poussé, mais ça donne suffisamment de pistes pour mieux cibler les recherches🙂

Voici les billets en rapport :

 

Rappels autour du XML

 
Le EXtensible Markup Language (langage de balisage extensible) est donc un langage fonctionnant avec des balises signalées par des chevrons ().
(X)HTML, XSD, XSLT, XSL (etc.) sont des dérivés du XML, lui-même un dérivé du SGML.

Le XML est développé (et normé) par le W3C (World Wide Web Consortium).

Le XSD (XML Schema Definition) est un document XML, normé, permettant de décrire le structure d’un fichier XML (balises autorisées et leur type de données).

 

Exemple de XSD

 

Je vais donner ici un rapide aperçu, mais pour réellement apprendre à écrire un XSD, je vous invite à aller sur le site du W3C : Start learning XML Schema now!.

Voici un exemple commenté de XSD.
C’est le même XSD qui sera reprit pour les autres billets.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" >
  <!-- SimpleType : les types unitaires représentant une balise spécifique -->
  <!-- C'est la que l'on va déclarer la granularité la plus fine -->
  <xs:simpleType name="T_NAME">
    <xs:annotation>
      <xs:documentation>Nom-prénom d'une personne.</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <!-- Le nom est une chaîne de caractères dont la taille varie de 1 à 25 -->
      <xs:minLength value="1"/>
      <xs:maxLength value="25"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="T_LOGIN">
    <xs:annotation>
      <xs:documentation>Login d'un compte.</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:minLength value="3"/>
      <xs:maxLength value="15"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="T_MAIL">
    <xs:annotation>
      <xs:documentation>Email d'un compte.</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:minLength value="3"/>
      <xs:maxLength value="30"/>
      <!-- Expression régulière pour valider la chaîne -->
      <xs:pattern value="[^@]+@[^\.]+\..+"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="T_IDENTIFIANT">
    <xs:annotation>
      <xs:documentation>Identifiant d'un compte.</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:integer">
      <xs:totalDigits value="10"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="T_COMMENT">
    <xs:annotation>
      <xs:documentation>Commentaire sur un compte.</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:minLength value="0"/>
      <xs:maxLength value="255"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="T_NBUSERS">
    <xs:annotation>
      <xs:documentation>Nombre d'utilisateurs dans le fichier.</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:integer"/>
  </xs:simpleType>
  <xs:simpleType name="T_DATE">
    <xs:annotation>
      <xs:documentation>Date au format JJMMAAAA</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:length value="8"/>
      <xs:pattern value="((0[1-9]{1})|([1-2]{1}[0-9]{1})|(30|31))((0[1-9]{1})|(1[0-2]{1}))((19|20)([0-9]{2}))"/>
    </xs:restriction>
  </xs:simpleType>
  
  <!-- ComplexType : les types unitaires représentant un ensemble de balises -->
  <xs:complexType name="CT_USER">
    <xs:annotation>
      <xs:documentation>Balise englobant un utilisateur.</xs:documentation>
    </xs:annotation>
    <!-- Sequence : les balises DOIVENT respecter cet ordre -->
    <!-- Il y a d'autres possibilités : -->
    <!-- All : l'ordre n'est pas important, mais les balises DOIVENT être présentes 1 et 1 seule fois -->
    <!-- Choice : veut dire : "il peut y avoir les éléments suivants" -->
    <xs:sequence>
      <!-- La balise CT_USER va donc contenir, dans l'ordre, les balises suivantes : -->
      <xs:element name="IDENTIFIANT" type="T_IDENTIFIANT"/>
      <xs:element name="NOM" type="T_NAME"/>
      <xs:element name="PRENOM" type="T_NAME"/>
      <xs:element name="LOGIN" type="T_LOGIN"/>
      <xs:element name="MAIL" type="T_MAIL"/>
      <xs:element name="COMMENT" type="T_COMMENT"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="CT_HEADER">
    <xs:annotation>
      <xs:documentation>Balise englobant un utilisateur.</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="NBUSERS" type="T_NBUSERS" minOccurs="1" maxOccurs="1"/>
      <xs:element name="DATEEXPORT" type="T_DATE" minOccurs="1" maxOccurs="1"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="CT_EXPORT">
    <xs:annotation>
      <xs:documentation>Description du contenu du fichier.</xs:documentation>
    </xs:annotation>
    <xs:sequence>
    <!-- minOccurs : l'élément DOIT être présent X fois au minimum ; le header doit être présent, mais les users ne sont pas obligatoires -->
    <!-- maxOccurs : l'élément peut apparaître au maximum X fois ; le header ne peut apparaître qu'une fois, mais il y a autant de users que voulus -->
      <xs:element name="HEADER" type="CT_HEADER" minOccurs="1" maxOccurs="1"/>
      <xs:element name="USER" type="CT_USER" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <!-- Contenu attendu du fichier XML. -->
  <!-- Le fichier va donc contenir une balise (root) EXPORT -->
  <!-- Donc forcément un HEADER et de 0 à N balises USER -->
  <xs:element name="EXPORT" type="CT_EXPORT">
    <xs:annotation>
      <xs:documentation>Export des utilisateurs.</xs:documentation>
    </xs:annotation>
  </xs:element>
</xs:schema>

 

Exemple de XML lié au XSD

 

<?xml version="1.0" encoding="utf-8"?>
<EXPORT>
  <HEADER>
    <NBUSERS>2</NBUSERS>
    <DATEEXPORT>07112012</DATEEXPORT>
  </HEADER>
  <USER>
    <IDENTIFIANT>0000000001</IDENTIFIANT>
    <NOM>GUYOT</NOM>
    <PRENOM>Fabien</PRENOM>
    <LOGIN>fguyot</LOGIN>
    <MAIL>fguyot@sample.com</MAIL>
    <COMMENT />
  </USER>
  <USER>
    <IDENTIFIANT>0000000002</IDENTIFIANT>
    <NOM>DOE</NOM>
    <PRENOM>JOHN</PRENOM>
    <LOGIN>jdoe</LOGIN>
    <MAIL>jdoe@sample.com</MAIL>
    <COMMENT><![CDATA[Le compte est actuellement suspendu & doit être désactivé.]]></COMMENT>
  </USER>
</EXPORT>

Au niveau de la balise COMMENT, on peut voir un cas où elle est vide et un cas où elle est alimentée.
Dans le second cas, elle comprends une indication CDATA.
Les CDATA sont présents afin d’encapsuler des caractères interdits en XML.
Il est facile de s’en souvenir, il n’y en a que trois : et &.
Ceci dit, il est possible de se passer du CDATA et de remplacer ces caractères par leurs équivalents en code HTML, respectivement :

&lt; , &gt; et &amp;
Catégories :XML, XSD

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :