\documentclass[a4paper,french,12pt]{article}

\title{XML et webservices}
\author{}
\date{Dernière compilation~: \today{} à \currenttime}

\usepackage{styles}

\begin{document}

\maketitle
\tableofcontents

\clearpage

\section{XML --- eXtensible Markup Language}

\subsection{Le standard XML}

\subsubsection{Objectifs}

    On veut représenter des données facilements lisibles par les humains et par les machines.
    La technologie doit être compatible web (facilement intégrable dans les serveurs web).
    Elle doit permettre de séparer les aspects de présentation (format, couleurs, etc.) et d'information (données).
    Tout ceci doit se faire de manière \emph{standardisée}.

\subsubsection{Pourquoi XML~?}

    Les langages à balise HTML (HyperText Markup Language) et SGML (Standard Generalized Markup Language) sont deux formats existants.
    On peut aussi trouver ASN.1 (Abstract Syntax Notation), CDR, XDR (Common, eXternal Data Representation), etc.

\paragraph{Critique de HTML}

    HTML est un langage simple, lisible et compatible web.

    Mais il présente les défauts suivants~:

    \begin{itemize}
        \item non extensible (il y a un nombre fixe de balises et d'attributs)
        \item mélange des genres (structure et mise en forme)
        \item incompatibilité entre navigateurs et versions
        \item pas de preuve sur le document
    \end{itemize}

\paragraph{Critique de SGML}

    SGML est un langage puissant, extensible, standard.
    C'est aussi un méta-langage de documentation pour grosses applications.

    Mais~:

    \begin{itemize}
        \item il est trop complexe, donc une implémentation trop lourde
        \item il n'est pas forcément compatible web
    \end{itemize}

\paragraph{Le XML}

    On peut voir XML comme une variante de HTML généralisée et comme un sous-ensemble de SGML\@.
    C'est un langage à balises configurables pour la représentation hiérarchique de données.

\subsubsection{Structure d'un document XML}

\paragraph{Prologue}

    Ce rôle est équivalent au \texttt{<head>} en HTML\@.
    Il contient les méta-informations~: instructions de traitement, commentaires.

    \begin{lstlisting}[gobble=4]
        <?xml version="1.0" standalone="no" encoding="ISO8859-1"?>
        <!DOCTYPE liste_CD SYSTEM "CDs.dtd">
    \end{lstlisting}

\paragraph{Corps}

    Équivalent au \texttt{<body>} en HTML\@.
    Les données sont formatées par des \emph{balises} d'encadrement, des \emph{attributs} associés aux balises et des \emph{données} encadrées par les balises.

    \begin{lstlisting}[gobble=4]
        <liste_CD>
            <CD>
                <artiste type="individual">Frank Sinatra</artiste>
                <titre no_pistes="4">In The Wee Small Hours</titre>
                <pistes>
                    <piste>In The Wee Small Hours</piste>
                    <piste>Mood Indigo</piste>
                </pistes>
                <prix monnaie="euro" payment="CB">12.99</prix>
                <en_vente/>
            </CD>
            <CD>...</CD>
        </liste_CD>
    \end{lstlisting}

    Le balisage est arborescent.
    La racine du corps est unique.
    Les balises sont soit par paires, soit uniques.
    Le contenu entre deux balises paires est une valeur simple, une arborescence d'autres balises, ou un mélange des deux.
    Certaines balises (de début) content des attributs.

    Les caractères \texttt{\^}, \texttt{\%} et \texttt{\&} sont interdits.

\subsubsection{Document bien formé}

    Un document XML avec une syntaxe correcte est dit bien formé~:

    \begin{itemize}
        \item un seul élément racine
        \item les balises doivent avoir une balise fermante
        \item les balises sont sensibles à la casse
        \item les valeurs des attributs doivent être entre guillemets
        \item les balises ne doivent pas se chevaucher
    \end{itemize}

\subsection{Définition des documents XML}

    Si un document est bien formé, il peut être candidat pour être \emph{valide}.
    Un document XML valide est un document associé à une \emph{DTD} (\texttt{.dtd}) ou un \emph{schéma} (\texttt{.xsd}).
    Le document peut alors être échangé~: c'est un format \emph{standardisé}.

\subsubsection{DTD}

    Le DTD permet de définir le \emph{vocabulaire} et la structure qui seront utilisés dans le document XML\@.
    C'est une grammaire du langage dont les phrases sont des documents XML\@.
    On peut le mettre dans le prologue du fichier XML\@, ou, mieux, le mettre dans un fichier et le référencer dans le document XML\@.

\paragraph{ELEMENT et attributs}

    \texttt{<!ELEMENT} \emph{balise} (contenu)\texttt{>} décrit une \emph{balise} qui fera partie du vocabulaire.

    \texttt{<!ATTLIST} \emph{balise} \texttt{[attribut type \#mode [valeur]]>} définit la liste d'attributs pour une balise.

\paragraph{Structuration des balises}

    Le contenu d'une balise est structuré de la manière suivante~:

    \begin{itemize}
        \item \texttt{(a, b)} --- séquence~: \texttt{(nom, prénom, rue, ville)}
        \item \texttt{(a|b)} --- liste de choix~: \texttt{(oui|non)}
        \item \texttt{a?} --- élément optionnel~: \texttt{(nom, prénom?, rue, ville)}
        \item \texttt{a*} --- élément répétitif $[0,n]$~: \texttt{(produit*, client)}
        \item \texttt{a+} --- élément répétitif $[1,n]$~: \texttt{(produit*, vendeur+)}
    \end{itemize}

\paragraph{Types de données}

    \begin{itemize}
        \item \texttt{CDATA} --- données brutes non analysées par le parseur
        \item \texttt{PCDATA} --- élément de texte sans descendants ni attributs contenant des caractères
        \item \texttt{Énumération} --- liste de valeurs séparées par \texttt{|}
        \item \texttt{ID} et \texttt{IDREF} --- clé et référence pour les attributs
        \item \texttt{ANY} --- tout texte possible (utilisé pour le développement)
        \item \texttt{EMPTY} --- vide
    \end{itemize}

\paragraph{Exemples}

    \begin{lstlisting}[gobble=4]
        <!ELEMENT doc (livre* | article+)>
        <!ELEMENT livre (titre, auteur+)>
        <!ELEMENT article (titre, auteur*)>
        <!ELEMENT titre (#PCDATA)>
        <!ELEMENT auteur (nom, adresse)>
            <!ATTLIST auteur id ID #REQUIRED>
        <!ELEMENT nom (prenom?, nomfamille)>
        <!ELEMENT prenom (#PCDATA)>
        <!ELEMENT nomfamille (#PCDATA)>
        <!ELEMENT adresse ANY>
    \end{lstlisting}

\paragraph{L'intérêt des DTD externes}

    Un fichier DTD externe peut être un modèle pour plusieurs documents, qui partagent des balises et des structures.

    On peut très bien définir une ressource DTD distance (avec URL).

\paragraph{Entités dans les DTD}

    Une entité permet la réutilisation dans une DTD\@.

    \begin{itemize}
        \item Déclaration interne~:
            \verb+<!ENTITY entity-name "entity-value">+
        \item Déclaration externe~:
            \verb+<!ENTITY entity-name SYSTEM "entity-url">+
    \end{itemize}

    Pour la référencer~: \verb+&entity-name+. \\
    Par exemple, avec \verb+<!ENTITY website "http://www.thescarms.com">+, dans un document XML, \verb+<url>&website</url>+ sera évalué à \verb+<url>http://www.thescarms.com</url>+.

\paragraph{Les limites des DTD}

    Les DTD ne permettent pas de types de données.
    Ils sont diffices à interpréter, difficiles à traduire en schéma objets, et ne permettent pas d'héritage.

    Le W3C a donc proposé un complément, XML-schema.

\subsubsection{XML Schema}

    Les objectifs sont les suivants~:

    \begin{itemize}
        \item reprendre les acquis des DTD, tout en étant plus riche et complet
        \item permettre de typer les données, avec des attributs simples et des éléments simples et complexes.
        \item permettre de définir des contraintes (occurence obligatoire ou optionnelle, cardinalités, références)
        \item permettre la réutilisation avec les namespaces
    \end{itemize}

    Le schéma d'un document XML définit les éléments possibles dans le document, les attributs associés à ces éléments, la structure du document et les types de données.
    Il est spécifié en XML~: il est donc analysable par un parseur XML standard.

\paragraph{Définir un schéma XML}

    Il faut créer un document \texttt{.xsd}.
    \texttt{<schema>} est l'élément racine~:

    \begin{lstlisting}[gobble=4]
        <?xml version="1.0"?>
        <xsd:schema>
            ...
        </xsd:schema>
    \end{lstlisting}

\paragraph{Référencer un schéma XML}

    On ajoute la référence au niveau de la balise racine du document XML~:

    \begin{lstlisting}[gobble=4]
        <?xml version="1.0"?>
        <note xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="fichier.xsd">
            ...
        </note>
    \end{lstlisting}

\paragraph{Déclaration d'un élément simple}

    Un élément simple contient des données dont le type est simple.
    Il ne contient donc pas d'autres éléments ni d'attributs.

    Sa syntaxe est la suivante~:
    \begin{lstlisting}[gobble=4]
        <xsd:element name="Departement" type="xsd:decimal"/>
    \end{lstlisting}

    Dans le document XML, on aurait alors~:
    \begin{lstlisting}[gobble=4]
        <Departement>13</Departement>
    \end{lstlisting}

    On peut définir des valeurs par défaut~:
    \begin{lstlisting}[gobble=4]
        <xsd:element name="color" type="xsd:string" default="red"/>
    \end{lstlisting}

    \ldots{} ou bien des valeurs inchangeables~:
    \begin{lstlisting}[gobble=4]
        <xsd:element name="color" type="xsd:string" fixed="red"/>
    \end{lstlisting}

\paragraph{Les types simples}

    \begin{tabularx}{\linewidth}{lX}
        \toprule
        \emph{Type}        & \emph{Description} \\
        \midrule
        string             & chaîne de caractères \\
        boolean            & true ou false \\
        decimal            & nombre décimal \\
        float              & nombre à virgule \\
        double             & réel double \\
        duration           & durée \\
        dateTime           & valeur date/heure \\
        time               & valeur horaire (\verb+hh:mm:ss.sss+) \\
        date               & date au format \texttt{CCYY-MM-DD} \\
        gYearMonth         & un mois et une année grégorienne (\texttt{CCYY-MM}) \\
        gYear              & une année (\texttt{CCYY}) \\
        gMonthDay          & le jour d'un mois (\texttt{MM-DD}) \\
        gDay               & le jour d'un mois (\texttt{DD}) \\
        gMonth             & le mois (\texttt{MM}) \\
        hexBinary          & contenu binaire au format hexadécimal \\
        base64Binary       & contenu binaire au format base64 \\
        anyURI             & adresse URI \\
        QName              & nom qualifié \\
        NOTATION           & nom qualifié \\
        Token              & chaîne de caractères sans espaces \\
        Language           & langage, exprimé sous forme de mot clés \\
        NMTOKEN            & alphanumérique et \verb+.:-_+ \\
        NMTOKENS           & NMTOKEN avec espaces \\
        ID                 & type d'attribut ID \\
        IDREF, IDREFS      & type d'attribut IDREF et IDREFS \\
        ENTITY ENTITIES    & type d'attribut ENTITY et ENTITIES \\
        Integer            & nombre entier \\
        nonPositiveInteger & nombre entier négatif, incluant le zéro \\
        nonNegativeInteger & nombre entier positif, incluant le zéro \\
        negativeInteger    & nombre entier négatif, excluant le zéro \\
        positiveInteger    & nombre entier positif, excluant le zéro \\
        long               & nombre entier long \\
        int                & nombre entier \\
        short              & nombre entier court \\
        unsignedLong       & nombre entier non signé \\
        unsignedInt        & nombre entier non signé \\
        unsignedShort      & nombre entier non signé \\
        byte               & nombre entier compris entre -128 et 127 \\
        unsignedByte       & nombre entier non signé, compris entre 0 et 255 \\
        \bottomrule
    \end{tabularx}

\paragraph{Éléments complexes}

    Un élément complexe contient d'autres éléments et/ou attributs.
    Il y a trois types d'éléments complexes~:
    \begin{enumerate}
        \item élément qui contient d'autres éléments et/ou des attributs
        \item élément qui contient du texte et des attributs
        \item élément qui contient du texte et d'autres éléments
    \end{enumerate}

\paragraph{Le type \texttt{sequence}}

    Il spécifie que les éléments fils doivent apparaître dans un ordre spécifique.

    \begin{lstlisting}[gobble=4]
        <xsd:element name="address">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element name="name" type="xsd:string"/>
                    <xsd:element name="street" type="xsd:string"/>
                    <xsd:element name="city" type="xsd:string"/>
                    <xsd:element name="state" type="xsd:string"/>
                    <xsd:element name="zip" type="xsd:decimal"/>
                </xsd:sequence>
                <xsd:attribute name="country" type="xsd:NMTOKEN" fixed="FR"/>
            </xsd:complexType>
        </xsd:element>
    \end{lstlisting}

\paragraph{Le type \texttt{all}}

    Il spécifie que les éléments peuvent apparaître dans un ordre quelconque.
    Chaque élément fils doit n'apparaître qu'une fois.

    \begin{lstlisting}[gobble=4]
        <xsd:element name="person">
            <xsd:complexType>
                <xsd:all>
                    <xsd:element name="firstname" type="xsd:string"/>
                    <xsd:element name="lastname" type="xsd:string"/>
                </xsd:all>
            </xsd:complexType>
        </xsd:element>
    \end{lstlisting}

\paragraph{Le type \texttt{choice}}

    Il spécifie que seul un élément fils doit apparaître.

    \begin{lstlisting}[gobble=4]
        <xsd:element name="person">
            <xsd:complexType>
                <xsd:choice>
                    <xsd:element name="employee" type="employee"/>
                    <xsd:element name="member" type="member"/>
                </xsd:choice>
            </xsd:complexType>
        </xsd:element>
    \end{lstlisting}

\paragraph{Indication d'occurences}

    Pour spécifier le nombre d'occurences d'un élément~: \texttt{maxOccurs} et \texttt{minOccurs}.

    \begin{lstlisting}[gobble=4]
        <xsd:element name="person">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element name="full_name" type="xsd:string"/>
                    <xsd:element name="child_name" type="xsd:string" maxOccurs="10" minOccurs="0"/>
                </xsd:sequence>
            </xsd:complexType>
        </xsd:element>
    \end{lstlisting}

\paragraph{Héritage de types}

    On peut définir des sous-types par héritage de types simples ou complexes~:

    \begin{itemize}

        \item Par extension~: ajout d'informations~:

            \begin{lstlisting}[gobble=12]
                <xsd:complexType name="address">
                    <xsd:complexContent>
                    <xsd:extension base="AddressFR">
                        <xsd:sequence>
                            <xsd:element name="pays" type="xsd:string"/>
                        </xsd:sequence>
                    </xsd:extension>
                    </xsd:complexContent>
                </xsd:complexType>
            \end{lstlisting}

        \item Par restriction~: ajout de contraintes.
            En utilisant des expressions régulières, on peut définir des contraintes sur des types simples~:

            \begin{lstlisting}[gobble=12]
                <xsd:simpleType name="SKU">
                    <xsd:restriction base="xsd:string">
                        <xsd:pattern value="\d{3}-[A-Z]{2}"/>
                    </xsd:restriction>
                </xsd:simpleType>
            \end{lstlisting}

            D'autres restrictions existent~:

            \begin{tabularx}{\linewidth}{lX}
                \toprule
                \emph{Constraint} & \emph{Description} \\
                \midrule
                enumeration & liste des valeurs acceptables \\
                fractionDigits & nombre de chiffres après la virgule \\
                length & nombre de caractères ou d'éléments de liste \\
                maxExclusive & la valeur maximale doit être plus petite que cette valeur \\
                minExclusive & la valeur minimale doit être plus grande que cette valeur \\
                maxInclusive & la valeur maximal doit être plus petite ou égale à cette valeur \\
                minInclusive & la valeur minimale doit être plus grande ou égale à cette valeur \\
                maxLength & nombre maximal de caractères ou d'éléments de liste \\
                minLength & nombre minimal de caractères ou d'éléments de liste \\
                pattern & séquence de caractères acceptable \\
                totalDigits & nombre de chiffres acceptable \\
                whiteSpace & définit comment gérer les espaces, tabulations, retours à la ligne\ldots \\
                \bottomrule
            \end{tabularx}

    \end{itemize}

\subsection{Mise en forme, traitement et transformations des documents XML}

\subsubsection{Mise en forme~: feuilles de styles XSL}

\subsubsection{DOM --- Document Object Model}

\subsubsection{XPath}

\subsubsection{Transformations XSLT}


\end{document}
