% $Id: slides.tex,v 1.5 2004/03/02 13:09:14 bortzmeyer Exp $ % Mise au point \documentclass[a4,landscape,article]{seminar} %\documentclass[a4,landscape,article,slidesonly]{seminar} % Impression réelle %\documentclass[a4,landscape,slidesonly]{seminar} %%%%%%%%%% \usepackage[latin1]{inputenc} \usepackage{fancybox} \usepackage[slides]{afnic} \usepackage[french, english]{babel} \newpagestyle{MH}% {XML\hfil\thepage} {AFNIC\hfil{}Stéphane Bortzmeyer} \slidepagestyle{MH} \epsfslidesize \pagestyle{empty} \title{XML~: vision générale} \author{Stéphane Bortzmeyer \\ \url{}} \date{2 Mars 2004} \begin{document} \begin{slide} \maketitle \addtocounter{slide}{-1} \slidepagestyle{empty} \end{slide} \begin{slide} \addtocounter{slide}{-1} Ce document est distribué sous les termes de la GNU Free Documentation License \url{http://www.gnu.org/licenses/licenses.html#FDL}. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. \end{slide} \begin{slide} \heading{XML se répand partout} Utilisations ``texte'' : \begin{itemize} \item documentation (DocBook, \rfc{2629}), \item format de fichiers (OpenOffice). \end{itemize} Utilisations ``données'' : \begin{itemize} \item fichiers de configuration (ZoneCheck, plug-in de qualification), \item protocoles pour les registres (EPP, IRIS), \item protocole pour "middleware" (XML-RPC), \end{itemize} \end{slide} Tous les projets de logiciel libre font maintenant leur documentation en XML (sauf Python). Dans le monde IETF, voir le \rfc{3470}. Mais tout le monde n'est pas d'accord : \url{http://bitmover.com/pipermail/lmbench-users/2003-November/000076.html} ou \url{http://xmlsucks.org/} ou encore \url{http://c2.com/cgi/wiki?XmlSucks}. Ironie : XML était prévu pour le Web et normalisé par le W3C mais est peu utilisé pour le Web. \begin{slide} \heading{Les bases de XML} XML est un méta-langage (les vrais langages ou \textbf{vocabulaires} sont Docbook, FO, SVG, TEI, \ldots). XML est un cadre pour faire des formats de fichier. Pas un langage de programmation. Le modèle de données est hiérarchique. XML était un sous-ensemble de SGML (mais c'est moins vrai désormais). \end{slide} À cause de cette notion de vocabulaire, il est difficile de dire ``je connais XML'' si on ne connais que DocBook. \begin{slide} \heading{La soupe de sigles XML} XML, XSLT, XSL-FO, Xpath, Xlinks, Xpointer, W3C Schema, Relax NG, DTD, Xquery, SVG, XHTML, SOAP, RSS, RDF, \ldots \end{slide} \begin{slide} \heading{La syntaxe} Dans un document XML, il y a des \textbf{éléments} (qui ont parfois des \textbf{attributs}) emboîtés. Les éléments peuvent être vides, contenir d'autres éléments ou bien du texte. Les noms des éléments sont définis par le vocabulaire. \begin{info} example.fr \end{info} Sans la connaissance du vocabulaire, un document XML ne sert pas à grand'chose (sauf vocabulaire trivial). \end{slide} C'est pour cela que ce n'est pas parce qu'une application produit du XML qu'elle est ouverte. GFDL : ``Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD\ldots'' \begin{slide} \heading{Les \foreign{namespaces}} Si on veut mélanger des éléments de plusieurs vocabulaires. % TODO: meilleur exemple! doc: ou bien Dublin Core \begin{info} example.fr 123456789 \end{info} Les préfixes des espaces de noms (ici, ``afnic'' et ``inpi'') sont définis par un URI (\rfc{3305}). C'est l'URI qui compte, \textbf{pas} le préfixe : \begin{info} example.fr 123456789 \end{info} Les \foreign{namespaces} rendent la validation difficile. % TODO: validation et extraction en XSL \end{slide} \begin{slide} \heading{Conformité} Les niveaux de conformité d'un document XML : \begin{enumerate} \item \textbf{bien formé} : syntaxiquement correct, les marques fermantes correspondent aux entrantes. Ne dépend pas du vocabulaire. \item \textbf{valide} : obéit à un vocabulaire précis. \item \textbf{correct par rapport aux règles ``métier''} : pour l'instant, ce niveau n'est pas formellement traité par XML. \end{enumerate} Ce document n'est pas bien formé : \begin{info} \end{info} \end{slide} Un document XML \textbf{doit} être bien formé. XML, en raison de la catastrophe d'HTML, rompt avec le principe ``Etre libéral dans ce qu'on reçoit, \ldots'' \begin{slide} \heading{Validité} Ce document DocBook est bien formé mais n'est pas valide. \begin{info}
Title should come first. Bad example
\end{info} On peut utiliser un éditeur qui guide pour ne produire que des documents valides (Emacs+psgml, Emacs+nxml, \ldots). On peut vérifier a posteriori (réception de XML par le réseau : \textbf{sécurité}). \end{slide} OpenReg ne semble pas valider les éléments EPP... \begin{slide} \heading{Décrire les règles} Décrire un langage au dessus de XML (DTD, W3C schémas et Relax NG). On peut aussi le faire informellement. C'est un travail de \textbf{modélisation} (donc pas purement mécanique). \end{slide} \begin{slide} \heading{Document Type Definition} Une DTD décrit la composition des éléments. \begin{info} \end{info} Les DTD sont hérités de SGML. Leur syntaxe est non-XML. Aucun typage possible (cf. règle LDH dans l'élément \computer{name} ci-dessus). Beaucoup d'outils pour DTD. \end{slide} \begin{slide} \heading{Un document conforme à cette DTD} \begin{info} foobar.example ns1.example.com ns2.example.com \end{info} \end{slide} \computer{ipaddress} est optionnelle. Insister sur l'absence de typage (entiers positifs, etc). \begin{slide} \heading{Identifiants} Pour trouver la DTD d'un document XML, on utilise les identifiants : \begin{itemize} \item publics, \item système. \end{itemize} \begin{info} \end{info} Les catalogues permettent de trouver un nom de fichier à partir d'un identifiant. \end{slide} \begin{slide} \heading{Vérifier avec une DTD} \begin{info} nsgmls -s -wxml /usr/share/sgml/declaration/xml.dcl example.xml \end{info} \begin{info} xmllint --valid --noout example.xml \end{info} \end{slide} Le premier outil, partie du paquetage sp, traite SGML. Le second, partie du paquetage libxml2, ne traite que XML. \begin{slide} \heading{W3C schémas} Un des langages de schémas mais pas le seul. Normalisé par le W3C. Syntaxe XML. Comme une DTD, un W3C schéma décrit la composition des éléments. Très riche, notamment pour le typage. Sépare la description de la structure et celle du contenu. Utilisé dans plusieurs protocoles Internet comme EPP ou IRIS. Peu d'outils (trop complexe ?). \end{slide} \begin{slide} \heading{Exemple de W3C schema, EPP} \begin{info} ... \end{info} \end{slide} \begin{slide} \heading{Xerces} Une vérification d'un schéma avec Xerces (validateur d'Apache) : \begin{info} % perl DOMPrint.pl -v=always -n -s personal-schema.xml > /dev/null Error in eval: ERROR: FILE: /home/bortzmeyer/tmp/personal-schema.xml LINE: 9 COLUMN: 12 MESSAGE: Not enough elements to match content model : '(name,email*,url*,link,link,link?)' at DOMPrint.pl line 131 at DOMPrint.pl line 132 \end{info} % TODO: tester avec le schéma d'EPP \end{slide} \begin{slide} \heading{Relax NG} Un autre langage de schéma, très populaire dans le monde du logiciel libre. Normalisé dans le cadre d'Oasis. Syntaxe XML ou ``compacte''. Relax décrit des motifs, auxquels un document valide doit se conformer (cf. expressions rationnelles). Moins riche pour le typage que les W3C schémas. On peut traduire du Relax en DTD ou en W3C schémas. Déjà des outils. \end{slide} \begin{slide} \heading{Exemple de schéma Relax NG} \begin{info} \end{info} \end{slide} \begin{slide} \heading{Exemple Relax NG en syntaxe compacte} \begin{info} element addressBook { element card { element name { text }, element email { text } }* } \end{info} %TODO: vérification avec Relax \end{slide} \begin{slide} \heading{Quel outil choisir ?} Ne pas oublier que Trang peut traduire de n'importe quel langage de schéma en presque n'importe quel autre. Ou bien utiliser un fichier XML d'exemple comme définition du vocabulaire (Examplotron). \end{slide} \begin{slide} \heading{XSLT} XSLT est un langage de transformation de documents XML : \begin{itemize} \item en documents XML d'un autre vocabulaire, \item ou en documents texte (BIND, LaTeX, *roff, etc). \end{itemize} Normalisé par le W3C, écrit en XML. \end{slide} Insister : XSLT n'est pas une feuille de style et ne connait rien à la présentation. \begin{slide} \heading{Exemple XSLT} Traduction de bibliographie \rfc{2629} en bibliographie utilisant la DTD du NIC générique : \begin{info} \end{info} \computer{select} prend comme argument une expression Xpath. \end{slide} \begin{slide} \heading{Autre exemple XSLT} Traduction d'un document XML d'un registre en fichier de zone BIND : \begin{info} . IN NS . . IN A \end{info} \end{slide} \begin{slide} \heading{XSLT en pratique} Implémentations : cela a pris du temps mais il en existe désormais beaucoup d'excellentes en logiciel libre. xsltproc (libxml2), xalan, sablotron, 4suite, \ldots Un exemple un peu tordu. La FAQ du service de surveillance des TLD (écrit en Mason) du NIC générique est écrite en XML (DTD QAML). Un processeur XSLT est appelé par Mason pour afficher la FAQ (rassurez-vous, il y a un cache). Cocoon permet de faire encore pire. \end{slide} \begin{slide} \heading{Usine à gaz avec XSLT} \begin{info} <% $stylesheet->output_string($results) %> <%init> my $results = $stylesheet->transform($source); <%once> use XML::LibXSLT; use XML::LibXML; my $prefix = "/var/www/www.generic-nic.net/dyn/mon"; my $parser = XML::LibXML->new(); my $xslt = XML::LibXSLT->new(); my $source = $parser->parse_file("$prefix/faq.xml"); my $style_doc = $parser->parse_file("$prefix/faq.xsl"); my $stylesheet = $xslt->parse_stylesheet($style_doc); \end{info} \end{slide} \begin{slide} \heading{Attaque par programme} XSLT n'est pas obligatoire pour faire des transformations. On peut aussi utiliser un programme en \foreign{name your favorite language here}. Plusieurs API : \begin{itemize} \item celle de l'analyseur expat, bâtie sur des événements (début d'élément, fin d'élément, \ldots), \item SAX (Simple API for XML), également bâtie sur des événements mais pas les mêmes, \item DOM (Document Object Model), bâti sur un modèle hiérarchique du document. \end{itemize} \end{slide} \begin{slide} \heading{Exemple SAX} On stocke uniquement les textes et on les affiche à chaque fin d'élément. \begin{info} public void characters(char[] content, int start, int len) { while (len-- > 0) { appendChar (content[start++]); } } public void endElement (String name) { flushChars(); } public void endDocument() { flushChars(); } \end{info} \end{slide} \begin{slide} \heading{Exemple DOM} \computer{Node} est le type essentiel en DOM. C'est un n\oe{}ud de l'arbre XML. On regarde tous les éléments de premier niveau (fils de la racine), puis on cherche l'infomation dans leurs fils : \begin{info} for node in tree.documentElement.childNodes: if node.nodeType == Node.ELEMENT_NODE: if node.nodeName == "member": for element in node.childNodes: if element.nodeName == "name": name = element.childNodes[0].nodeValue elif element.nodeName == "ip": ip = element.childNodes[0].nodeValue \end{info} \end{slide} Insister : avec le langage X et DOM, on peut faire tout ce que fait XSLT. Rappeler que le modèle de données de XML est hiérarchique. \begin{slide} \heading{Créer du XML} On peut créer du XML : \begin{itemize} \item avec vi, \item avec un programme qui fait du \computer{printf("\ldots}, \item avec un programme qui s'appuie sur DOM ou sur une autre API qui guide la génération de XML, \item avec un éditeur qui aide (mode psgml d'emacs ou nxml - mode Relax de Clark), \end{itemize} \end{slide} Avec l'approche printf, il faut échapper les caractères spéciaux. Et il faut faire attention à produire du XML valide. \begin{slide} \heading{Quelques langages (ou vocabulaires)} Des exemples pris au hasard... \end{slide} \begin{slide} \heading{FO (Formatting Objects)} Un langage de description de page. Normalisé W3C. Concurrent de PDF ou de Postscript. Pas encore d'imprimantes FO :-( On utilise souvent XSLT pour produire du FO à partir de Docbook ou de TEI. \begin{info} Since we are using the XML version of DocBook, here is how to call jade to translate myfile.db to TeX: \end{info} Pour faire du PDF à partir de FO : FOP. \end{slide} \begin{slide} \heading{SVG, Scalable Vector Graphics} Un langage de description d'images. Normalisé W3C. Concurrent de Flash ou de FIG. \begin{info} \end{info} Mozilla supporte SVG. \end{slide} \begin{slide} \heading{DocBook} Une vocabulaire très riche et très complexe pour les documentations techniques. Normalisé Oasis. Utilisé par quasiment tous les projets de logiciel libre. Documentations : \begin{info} nameservers is the exhaustive list of nameservers that are primary or secondary for the zone, they are separated by a semicolon, [...] a comma-separated list of IP addresses. For example: ns1.toto.fr=192.168.1.5,192.168.1.6;ns2.toto.fr \end{info} Articles : \begin{info} Le domaine est donc assez miné, et le vocabulaire complexe (). \end{info} \end{slide} \begin{slide} \heading{Désigner des éléments : Xpath} Syntaxe non-XML pour désigner une partie d'un document XML. Une sorte de grep \foreign{XML-aware}. \computer{/foo/bar} : tout fils nommé \computer{bar} d'un élément \computer{foo} de premier niveau. \computer{//contact[@handle="SB1"]} : tout élément (quel que soit son niveau) \computer{contact} qui a un attribut \computer{handle} dont la valeur est SB1. Serveur whois du NIC générique, dorsal XML : \begin{info} # Use XPath in the DOM tree to find the domain result = Evaluate("/zone/domain[fqdn=\"" + \ string.lower(domain) + "\"]", xml_dom_object.documentElement) \end{info} On trouve une bibliothèque Xpath dans toutes les bonnes bibliothèques XML. \end{slide} \begin{slide} \heading{Liens : Xlinks} Liens simples, analogues à ceux de HTML. Ou liens riches, bi-directionnels ou vers un ensemble, pas juste un point. Un \foreign{namespace} et des attributs standards. Aucun navigateur Web ne les accepte ? \begin{info} ... \end{info} \end{slide} \begin{slide} \heading{Xpointers} Xpath + URI. Permettent de pointer vers l'intérieur d'un document, sans modifier ce dernier. Pointer vers le troisième paragraphe du document \computer{doc.xml} : \texttt{http://exa.fr/foutoir/doc.xml\#xpointer(\textbf{/para[position()=3])}} Peuvent s'utiliser dans des Xlinks. \end{slide} Les avocats de l'IPR vont encore trouver un moyen d'interdire Xpath ! (Liens ``profonds''.) \begin{slide} \heading{Encodage XML: les services Web} Pas grand'chose à dire : XML ne sert que pour l'encodage. Le programmeur ne voit pas de XML. \end{slide} \end{document}