webservice

Manipulation des fichiers XML

Les outils déstinés à transformer les documents XML représentent ceux-ci comme un arbre de noeuds XML.

On peut transformer les documents XML à l'aide de :

XSL / XPath

  • XSL : C'est un language, qui est l'équivalent XML du CSS en HTML et permet donc d'écrire des feuilles de style.
  • XPath est un language qui permet de localiser des élements (noeuds) d'un fichier XML, par le biais de "requêtes".

Considérons l'arbre suivant

<?xml version="1.0"?>
 <racine>
  <encyclopedie nom="Wikipedia" site="http://fr.wikipedia.org/">
   <article nom="XPath">   
    <auteurs>
     <auteur>
      <nom>Dupont</nom>
     </auteur>
     <auteur>
      <nom>Dubois</nom>
     </auteur>
    </auteurs>
   </article>
  </encyclopedie>
 </racine>

Exemple de requêtes

Requête (expression XPath) Résultat obtenu
/article Sélectionne le noeud article
//article Sélectionne tous les noeuds article.
//article[@nom='XPath'] Sélectionne tous les noeuds article ayant un attribut nom dont la valeur est égale à XPath

Ce mode de requêtage est utilisé dans le XSLT.

XLL

Permet de créer des liens d'un document XML vers un autre (équivalent des hrefs en HTML)

<!-- Exemple de lien XLink -->
<paragraphe>Voici <ancre xlink:type="simple" xlink:href="#UnEntete">un lien</ancre> vers l'en-tête.</paragraphe>

Ou des liens vers une partie du document à l'aide des XPointer (équivalent des ancres HTML).

XSLT

Utilisé pour la transformation de document XML vers d'autres formats.

Le XSL permet de transformer un document XML vers le

  • HTML
  • PDF
  • LaTeX
  • etc

Un fichier XSLT va décrire un ensemble de règles de transformation s'appliquant à ou plusieurs noeuds.

Exemple de transformation du XML vers XML à l'aide de XSLT

<!-- Fichier de départ -->
<?xml version="1.0" ?>
<persons>
  <person username="JS1">
    <name>John</name>
    <family-name>Smith</family-name>
  </person>
  <person username="MI1">
    <name>Morka</name>
    <family-name>Ismincius</family-name>
  </person>
</persons>
<!-- Feuille de style XSLT -->
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/persons">
    <root>
      <xsl:apply-templates select="person"/>
    </root>
  </xsl:template>

  <xsl:template match="person">
    <name username="{@username}">
      <xsl:value-of select="name" />
    </name>
  </xsl:template>
</xsl:stylesheet>
<!-- Résultat -->
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <name username="JS1">John</name>
  <name username="MI1">Morka</name>
</root>

Exemple de transformation du XML vers le HTML à l'aide de XSLT

<!-- fichier de base -->
<personne>
    <nom>Dupond</nom>
    <prenom>Toto</prenom>
</personne>
<!-- On désire avoir l'output suivant -->
<html>
    <body>
        <p>
            <b>Dupond</b>
            Toto
        </p>
    </body>
</html>
<!-- Feuille de style XSLT -->
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" indent="yes"/>

    <xsl:template match="personne">
        <html>
            <body>
                <p>
                    <b>
                    <xsl:value-of-select="nom"/>
                    </b>
                    <xsl:value-of-select="prenom"/>
                </p>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

Le value-of-select réalise en fait une requête XPath.

DTD

La Document Type Definition (DTD), ou Définition de Type de Document, est un document permettant de décrire un modèle de document SGML ou XML. Le modèle est décrit comme une grammaire de classe de documents.

<!-- exemple de DTD -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE liste_de_gens [
 <!ELEMENT liste_de_gens (personne)*>
 <!ELEMENT personne (nom, date_de_naissance?, genre?, numero_de_secu?)>
 <!ELEMENT nom (#PCDATA)>
 <!ELEMENT date_de_naissance (#PCDATA)>
 <!ELEMENT genre (#PCDATA | masculin | féminin) "féminin">
 <!ELEMENT numero_de_secu (#PCDATA)>
]>
<liste_de_gens>
  <personne>
    <nom>Fred Bloggs</nom>
    <date_de_naissance>2008-11-27</date_de_naissance>
    <genre>masculin</genre>
  </personne>
</liste_de_gens>

XSD

Permet de définir la structure et le type de contenu d'un document XML. Cette définition permet notamment de vérifier la validité de ce document.

<!-- exemple de XSD --> 
 <?xml version="1.0" encoding="UTF-8"?>
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="personne">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="nom" type="xs:string" />
          <xs:element name="prenom" type="xs:string" />
          <xs:element name="date_naissance" type="xs:date" />
          <xs:element name="etablissement" type="xs:string" />
          <xs:element name="num_tel" type="xs:string" />
        </xs:sequence>
      </xs:complexType>
    </xs:element>
  </xs:schema>
<!-- fichier xml validé avec XSD -->
 <?xml version="1.0" encoding="UTF-8"?>
  <personne xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="personne.xsd">
    <nom>MBODJ</nom>
    <prenom>Babacar</prenom>
    <date_naissance>1996-10-06</date_naissance>
    <etablissement>NIIT</etablissement>
    <num_tel>764704140</num_tel>
  </personne>

Il existe beaucoup plus de types dans le XSD que dans le DTD

XSD amène cependant plusieurs différences avec les DTD

  • il permet par exemple de définir des domaines de validité pour la valeur d'un champ, alors que cela n'est pas possible dans une DTD ;
  • en revanche, il ne permet pas de définir des entités ;
  • XSD est lui-même un document XML, alors que les DTD sont des documents SGML.

Exemple DTD

<?xml version="1.0" encoding="UTF8">
    <!DOCTYPE Patient [
        <!ELEMENT Patient(...)>
        <!ELEMENT Date EMPTY>
        <!ATTLIST Date jj CDATA #REQUIRED
                  Date mm CDATA #REQUIRED
                  Date aa CDATA #REQUIRED>
        <!ELEMENT Nom (#PCDATA)>
        <!ELEMENT Diagnostic(Maladie)*>
        <!ATTLIST Diagnostic Catégorie CDATA #REQUIRED>
        <!ELEMENT Maladie(#PCDATA)>
        <!ELEMENT Prescriptions(Medoc)*>
        <!ELEMENT Medoc(#PCDATA)>
        <!ATTLIST Medoc Posologie CDATA #REQUIRED>
    ]>

Exemple XSD

Sur le partiel de l'année dernière

<?xml version="1.0" encoding="UTF8">
    <xs:schema xmlns="http://.../XMLSchema">
        <xs:element name="Patient">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="date">
                        <xs:complexType> 
                            <xs:attribute name="jj" type="xs:string" use="required" />
                            <xs:attribute name="dd" type="xs:string" use="required" />
                            <xs:attribute name="aa" type="xs:string" use="required" />
                        </xs:complexType>
                    </xs:element>
                    <xs:element name="nom" type="xs:string" />
                    <xs:element name="morphologie" type="morphologie">
                        <xs:complexType> 
                            <xs:attribute name="poids" type="xs:string" use="required" />
                            <xs:attribute name="taille" type="xs:string" use="required" />
                        </xs:complexType>
                    </xs:element>
                    <xs:element name="profession" type="xs:string">
                    <xs:element name="diagnostique">
                         <xs:complexType>
                            <xs:element name="maladie" maxOccurs="unbounded" type="xs:string"/>
                            <xs:attribute name="categorie" type="xs:string" use="required" />
                        </xs:complexType>
                    </xs:element>
                    <xs:element name="prescriptions">
                        <xs:complexType>
                            <xs:element name="medoc" maxOccurs="unbounded" type="xs:string">
                                <xs:complexType>
                                    <xs:attribute name="posologie" type="xs:string" use="required" />
                                </xs:complexType>
                            </xs:element>
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
        </xs:complexType>
    </xs:element name="Patient">