448 lines
17 KiB
TeX
448 lines
17 KiB
TeX
\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}
|