par Philippe Poulard Processeurs XML 0 Philippe.Poulard@sophia.inria.fr Philippe Poulard



Documents pareils
Programmation des Applications Réparties. Parsers XML DOM et SAX

34. DOM (Document Object Model)

Master d Informatique Corrigé du partiel novembre 2010

XML par la pratique Bases indispensables, concepts et cas pratiques (3ième édition)

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Architecture Orientée Service, JSON et API REST

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Documentation CAS à destination des éditeurs

Aspects techniques : guide d interfaçage SSO

XML et Java Vue Balisée en XML. Programmation avancée NFP 121. XML pourquoi faire? Structuration des données. Titre Auteur Section Paragraphe

Faculté de Génie Chaire industrielle en infrastructures de communication. La technologie XML. Wajdi Elleuch

Programmation Web. Madalina Croitoru IUT Montpellier

Les architectures 3-tiers Partie I : les applications WEB

Server-side XML. PAS FINI... mais ok pour un début. Originaux. Auteurs et version. Prérequis: Java de base, servlets, GUI et XML

27/11/12 Nature. SDK Python et Java pour le développement de services ACCORD Module(s)

Thierry BOULANGER. par la pratique. Bases indispensables Concepts et cas pratiques XML. 3 ième édition. Nouvelle édition

DOM - Document Object Model

Langage HTML (2 partie) <HyperText Markup Language> <tv>lt La Salle Avignon BTS IRIS</tv>

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

La base de données XML exist. A. Belaïd

Module BD et sites WEB

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Web Tier : déploiement de servlets

INTERNET est un RESEAU D ORDINATEURS RELIES ENTRE EUX A L ECHELLE PLANETAIRE. Internet : interconnexion de réseaux (anglais : net = réseau)

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Programmer en JAVA. par Tama

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

NFA016 : Introduction. Pour naviguer sur le Web, il faut : Naviguer: dialoguer avec un serveur web

Architectures web/bases de données

Document Object Model (DOM)

BASE DE DONNÉES XML NATIVE

Développement d'applications Web HTML5 L'art et la manière avec Visual Studio 2015 et TFS

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

as Architecture des Systèmes d Information

Architectures Web Services RESTful

L'API DOM : Document Object Model

RMI le langage Java XII-1 JMF

WDpStats Procédure d installation

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

les techniques d'extraction, les formulaires et intégration dans un site WEB

Gestion du cache dans les applications ASP.NET

Apache Camel. Entreprise Integration Patterns. Raphaël Delaporte BreizhJUG

XML, PMML, SOAP. Rapport. EPITA SCIA Promo janvier Julien Lemoine Alexandre Thibault Nicolas Wiest-Million

Table des matières Avant-propos... V Scripting Windows, pour quoi faire?... 1 Dans quel contexte?

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Cours Master Recherche RI 7 Extraction et Intégration d'information du Web «Services Web»

Devenez un véritable développeur web en 3 mois!

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

< _155_0>

La balise object incorporer du contenu en HTML valide strict

Java DataBaseConnectivity

WebSSO, synchronisation et contrôle des accès via LDAP

Architecture JEE. Objectifs attendus. Serveurs d applications JEE. Architectures JEE Normes JEE. Systèmes distribués

1. Installation d'un serveur d'application JBoss:

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

Outils de traitements de logs Apache

TP JAVASCRIPT OMI4 TP5 SRC

Introduction aux «Services Web»

Apache Cocoon Framework d'applications XML Sylvain Wallez Anyware Technologies

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

Production de documents avec XSLT. Production de documents p.1/??

Programmation Orientée Objet - Licence TIS CM8/9. Rappel sur la séance précédente. Lancelot Pecquet Lancelot.Pecquet@math.univ-poitiers.

Programmation Internet

Développement Logiciel

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Auteur LARDOUX Guillaume Contact Année 2014 DEVELOPPEMENT MOBILE AVEC CORDOVA

Mise en œuvre des serveurs d application

Auto-évaluation Programmation en Java

OpenPaaS Le réseau social d'entreprise

JavaServer Pages (JSP)

Remote Method Invocation Les classes implémentant Serializable

SQL Parser XML Xquery : Approche de détection des injections SQL

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Héritage presque multiple en Java (1/2)

Paginer les données côté serveur, mettre en cache côté client

10. Base de données et Web. OlivierCuré

Création d objet imbriqué sous PowerShell.

Sécurité des applications web. Daniel Boteanu

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Avant-propos 1. Avant-propos Organisation du guide À qui s'adresse ce guide?...4

Olivier Deheurles Ingénieur conception et développement.net

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

4. SERVICES WEB REST 46

Once the installation is complete, you can delete the temporary Zip files..

PHP 5.4 Développez un site web dynamique et interactif

Jahia. Guillaume Monnette École Ingénieurs 2000 Marne-La-Vallée IR3

Vulgarisation Java EE Java EE, c est quoi?

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Programme «Analyste Programmeur» Diplôme d état : «Développeur Informatique» Homologué au niveau III (Bac+2) (JO N 176 du 1 août 2003) (34 semaines)

<?xml version="1.0" encoding="iso " standalone="yes"?>

Alfstore workflow framework Spécification technique

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

PIVOT. Pivot/Querier Documentation technique XML/XSD/XSLT

Projet Java EE Approfondi

< Atelier 1 /> Démarrer une application web

Maîtriser le menu contextuel dans un OfficeBean

TP1. Outils Java Eléments de correction

Transcription:

0 Philippe.Poulard@sophia.inria.fr Philippe Poulard

Sommaire Processeurs généraliste / spécialiste Langages, architectures, plate-formes MSXML2 Ilôts de données avec MSXML2 Implémentation et utilisation de SAX Applications Web distribuées Configuration des parsers avec JAXP Composants de JAXP Création d'un document par programmation Prise en compte des espaces de nommage Le goût du blanc Validation Patrons de programmation Programmation avancée Error handling Entity resolver Sérialisation XSLT XSLT dans JAXP Sérialisation avec XSLT d un flux SAX modifié Architecture dans JAXP et Xalan XPath dans Xalan XSLT côté serveur Passage de paramètres avec XSLT (JAXP, MSXML2) Extensions, scripting 1 Xerces : DOM, SAX JAXP : DOM, SAX MSXML2 : DOM, SAX Choix d'un parseur Autre processeurs : spécialisés, propriétaires Conception d'un processeur XML Data Binding

Généralistes Spécialistes Quelques processeurs XML 2 Parsers Processeurs XSLT JAXP Processeur XSLFO Processeur SVG Processeur XSP / Processeur applicatif Microsoft MSXML MSXML2.4.x XML Apache Group Xalan Xerces James Clark's XP Megginson SAX Java JAXP XSLT, XPath DOM, SAX API Processeur "maison" DOM, SAX, XSLT

Quels langages / architectures? Java C C++ C# VB Perl JavaScript VBScript PHP Python Plates-forme Serveur Web Apache PHP, Perl, CGI Tomcat JAXP, Cocoon IIS DCOM Serveur d'application J2EE JAXP.NET DCOM Client Web Mozilla natif IE natif (ActiveX) Applet (Java) Applications 3

MSXML MSXML2.4.0 Obsolète pour XSLT Inclus : Processeur XSLT Evaluation XPath Quelques extensions très utiles Support des schémas XSD SAX MSXML2 Et aussi : le SDK, la documentation très complète de Microsoft Il faut positionner Conforme aux spécifications W3C certains paramètres du Performant parser pour être Pas d'accès au cœur (boîte noire) conforme au standard. Incorporé dans le navigateur IE6 Technologie ActiveX (utilisable avec scripts Jscript, VBscript, et les langages compilés VB, C++ ) Sur le client : îlots de données (technologie propriétaire Microsoft) XML data islands 4 Son utilisation suppose la maîtrise absolue des logiciels installés sur le parc client

Ilots de données XML Les îlots de données permettent d'incorporer des données XML dans une page HTML. Inclusion XML dans HTML L'insertion d'un îlot de données s'effectue par l'intermédiaire d'une balise <xml> <xml id="nom"> Données XML / </xml> Le balisage peut soit contenir un arborescence XML valide, soit utiliser un attribut src pointant vers un document XML. <xml id="nom" src="url"></xml> Il est également possible d'intégrer des îlots de données XML par l'intermédiaire des balises <script>. <script type="text/xml" id="nom"> Données XML / </script> 5 <script language="xml" id="nom"> Données XML / </script>

L'extraction des données peut se faire en utilisant plusieurs attributs associés aux balises HTML comme <table>, <div>, <input> ou <span>. Utilisation des îlots de données XML <table datasrc="#nom"> <tr> <td> <span datafld="nom_elément"></span> </td> </tr> </table> 6 <html> <body> <xml id="exemple"> <root> <foos> <foo>a</foo><bar>1</bar> </foos> <foos> <foo>b</foo><bar>2</bar> </foos> </root> </xml> <table datasrc="#exemple" border="1"> <tr> <td><span datafld="foo"></span></td> <td><span datafld="bar"></span></td> </tr> </table> </body> </html> Microsoft Internet Explorer A 1 B 2

Pagination <html> <body> <xml id="exemple"> <root> <foos> <foo>a</foo><bar>1</bar> </foos> <foos> <foo>b</foo><bar>2</bar> </foos> </root> </xml> <input type="button" value="page précédente" onclick="tab.previouspage();"> <input type="button" value="page suivante" onclick="tab.nextpage();"> <table datapagesize="1" id="tab" datasrc="#exemple"> <tr> <td><span datafld="foo"></span></td> <td><span datafld="bar"></span></td> </tr> </table> </body> </html> Microsoft Internet Explorer Page précédente Page suivante A 1 Microsoft Internet Explorer Page précédente Page suivante B 2 7

Hiérarchisation dans les îlots de données XML L'attribut datafld accepte les niveaux hiérarchiques afin de localiser distinctement les éléments à afficher par rapport à leurs ancêtres dans l'arborescence de l'îlot de données XML. Les éléments parent et enfant sont séparés par un point. <Elément_Racine> <Sous_Elément> <Enfant>...</Enfant> </Sous_Elément> </Elément_Racine> <table datasrc="#nom"> <tr> <td> <table datasrc="#nom" datafld="sous_elément"> <tr> <td> <input type="text" datafld="sous_elément.nom_enfant"> </input> </td> </tr> </table> </td> </tr> </table> 8

XSLT et îlots de données XML 9 <!doctype html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <body> <xml src="lefichierxml.xml" id="xmldoc" ondatasetcomplete="go()"></xml> <xml src="lafeuillexslt.xsl" id="xsldoc"></xml> <script type="text/javascript"> function go(){ //Attend le chargement des fichiers var xmldoc,xsldoc; xmldoc=document.getelementbyid("xmldoc"); xsldoc=document.getelementbyid("xsldoc"); if ((xmldoc.readystate=="complete" xmldoc.readystate==4) && (xsldoc.readystate=="complete" xsldoc.readystate==4)) what(); else settimeout("go()",100) function what(){ //effectue la transformation affecte le résultat à la variable res var res,xmldoc,xsldoc; xmldoc=document.getelementbyid("xmldoc").documentelement; xsldoc=document.getelementbyid("xsldoc").documentelement; res=xmldoc.transformnode(xsldoc); //remplace le HTML actuel par le résultat de la transformation document.body.innerhtml=res; </script> </body> </html>

Implémentation de SAX Xerces org.xml.sax.xmlreader interface org.apache.xerces.parsers.saxparser XMLReader parser = new SAXParser(); implémentation En passant par un factory, on n'a plus besoin d'importer spécifiquement l'implémentation Abstract factory - Factory method design patterns 10

Utilisation de SAX import java.io.ioexception; import org.xml.sax.saxexception; import org.xml.sax.xmlreader; import org.xml.sax.helpers.xmlreaderfactory; import org.xml.sax.contenthandler; import org.xml.sax.errorhandler; / ContentHandler contenthandler = new MyContentHandler(); ErrorHandler errorhandler = new MyErrorHandler(); try { XMLReader parser = XMLReaderFactory.createXMLReader( "org.apache.xerces.parsers.saxparser"); parser.setcontenthandler(contenthandler); parser.seterrorhandler(errorhandler); parser.parse(uri); catch (IOException e) { System.out.println("Erreur de lecture URI: "+ e.getmessage()); catch (SAXException e) { System.out.println("Erreur d'analyse: "+ e.getmessage()); 11

Applications Web distribuées Au lieu de : XMLReader parser = XMLReaderFactory.createXMLReader( "org.apache.xerces.parsers.saxparser"); Ou de : XMLReader parser = XMLReaderFactory.createXMLReader(); Utiliser plutôt : XMLReader parser = XMLReaderFactory.createXMLReader( PropertiesReader.getInstance().getProperty("analyseurSAX")); Permet de ne pas spécifier une propriété système (ici, l'analyseur SAX) pour un composant particulier mais pour toutes les applications distribuées Utilisation des propriétés systèmes de Java 12

Configuration des parsers avec JAXP JAXP est une interface abstraite qui permet d'utiliser : un parser DOM level 2 un parser SAX 2.0 un processeur XSLT (TrAX) JAXP permet : de contrôler le processus d'analyse aux applications d'être indépendantes d'une implémentation pluggable L'implémentation de l'outil utilisé peut être spécifié de plusieurs manières différentes : En définissant des propriétés système : javax.xml.parsers.saxparserfactory Dans le fichier : $JAVA_HOME/jre/lib/jaxp.properties Jar Service Provider META-INF/services/javax.xml.parsers.SAXParserFactory En utilisant le parser par défaut (fallback) 13

Configuration des parsers avec JAXP Exemples d'utilisation d'une implémentation particulière (avec Java 2 version 1.3) : Pour obtenir Xerces, utiliser classpath = xerces.jar (contient toutes les classes) Pour obtenir Crimson, utiliser classpath = jaxp.jar (contient javax.xml.*) crimson.jar (contient sax, dom) On obtient Xerces, si classpath = jaxp.jar xerces.jar crimson.jar 14

Composants de JAXP javax.xml.parsing.* javax.xml.transform.* SAX org.xml.sax.* DOM org.w3c.dom.* JAXP API SAX parsing SAX javax.xml.parsers.* org.xml.sax.* javax.xml.transform.* DOM org.w3c.dom.* DOM parsing Transformations 15

Création d'un document par programme Dépendant d'un parser Xerces import org.w3c.dom.document; import org.apache.xerces.dom.documentimpl; / Document doc = new DocumentImpl(); MSXML2 var objdoc = new ActiveXObject("Msxml2.DOMDocument.4.0"); JAXP import org.w3c.dom.document; import javax.xml.parsers.documentbuilderfactory; import javax.xml.parsers.documentbuilder; / DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newdocumentbuilder(); Document doc = builder.newdocument(); Est indépendant de toute implémentation Java reflection import org.w3c.dom.document; / String docimpl = "org.apache.xerces.dom.documentimpl"; Document doc = (Document) Class.forName(docImpl).newInstance(); 16 Se compile sans le parseur, dont le nom de classe peut être un paramètre système, ou contenu dans un fichier de configuration

Prise en compte des espaces de nommage Par défaut, JAXP ne prend pas en compte les espaces de nommage import org.w3c.dom.document; import javax.xml.parsers.documentbuilderfactory; import javax.xml.parsers.documentbuilder; / DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setnamespaceaware(true); DocumentBuilder builder = factory.newdocumentbuilder(); builder.parse( / ); Par défaut, Xerces prend en compte les espaces de nommage DOMParser parser = new DOMParser(); parser.setfeature("http://xml.org/sax/features/namespaces", false) parser.parse( / ); Document doc = parser.getdocument(); 17

Le goût du blanc MSXML2.4.0 ne conserve pas les nœuds blancs, sauf s'ils sont spécifiés par xml:space="preserve", ou si le parser reçoit explicitement la directive preservewhitespace : doc=new ActiveXObject("MSXML2.DOMDocument.4.0"); doc.async=false; doc.preservewhitespace=true; doc.load("monfichier.xml"); JAXP et Xerces adoptent par défaut le comportement standard. Xerces peut supprimer les nœuds blancs à condition qu'une grammaire soit présente pour que le parser puisse reconnaître les blancs ignorables. DOMParser parser = new DOMParser(); parser.setfeature("http://apache.org/xml/features/dom/include-ignorable-whitespace", false) parser.parse( / ); Document doc = parser.getdocument(); 18

Validation MSXML2.4.x doc=new ActiveXObject("MSXML2.DOMDocument.4.0"); doc.async= false; doc.validateonparse= true; doc.load("monfichier.xml"); Xerces parser.setfeature("http://xml.org/sax/features/validation", true) JAXP factory.setvalidating(true); Schema validation Xerces parser.setfeature("http://apache.org/xml/features/validation/schema", true) JAXP factory.setnamespaceaware(true); 19 MSXML2.4.x doc.validateonparse= true;

Patrons de programmation avec Xerces DOM parser import org.apache.xerces.parsers.domparser; import org.w3c.dom.document; String filename; / DOMParser parser = new DOMParser(); parser.parse(filename); Document doc = parser.getdocument(); SAX parser import org.xml.sax.helpers.xmlreaderfactory; import org.xml.sax.helpers.defaulthandler; import org.xml.sax.xmlreader; DefaultHandler handler; String filename; / XMLReader parser = XMLReaderFactory.createXMLReader(); parser.setcontenthandler(handler); parser.setdtdhandler(handler); parser.seterrorhandler(handler); parser.parse(filename); 20

Patrons de programmation avec JAXP DOM parser import javax.xml.parsers.documentbuilderfactory; import javax.xml.parsers.documentbuilder; import org.w3c.dom.document; String filename; / DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newdocumentbuilder(); Document doc = builder.parse(filename); SAX parser import javax.xml.parsers.saxparserfactory; import javax.xml.parsers.saxparser; import org.xml.sax.helpers.defaulthandler; DefaultHandler handler; String filename; / SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newsaxparser(); parser.parse(filename, handler); 21

Patrons de programmation avec MSXML2.4.x DOM parser avec JScript doc=new ActiveXObject("MSXML2.DOMDocument.4.0"); doc.async= false; filename =" / "; doc.load(filename); SAX parser avec VB Dim reader As SAXXMLReader40 Dim contenthandler As ContentHandlerImpl Dim errorhandler As ErrorHandlerImpl Set reader = New SAXXMLReader40 Set contenthandler = New ContentHandlerImpl Set errorhandler = New ErrorHandlerImpl Set reader.contenthandler = contenthandler Set reader.errorhandler = errorhandler 22

SAX2 dans JAXP SAX2 ContentHandler public interface ContentHandler { void startelement(namespaceuri, localname, qname, atts); void endelement(namespaceuri, localname, qname); void characters(ch[], start, length); / Application SAX2 typique XMLReader xmlreader = [create SAX2 XMLReader instance] xmlreader.setcontenthandler(mycontenthandler); xmlreader.parse(myinputsource); XML Reader SAXParserFactory spf = SAXParserFactory.newInstance(); // Change namespaces feature to SAX2 default spf.setnamespaceaware(true); // Create SAX XMLReader w/ SAX2 default features XMLReader xmlreader = spf.newsaxparser().getxmlreader(); // Use xmlreader as you would normally / 23

Patron de programmation DOM avec JAXP // Get platform default implementation DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // Set options dbf.setnamespaceaware(true); dbf.setvalidating(true); // Create new builder DocumentBuilder db = dbf.newdocumentbuilder(); db.seterrorhandler(myerrorhandler); Document doc = db.parse("myfile.xml"); // Use doc with usual DOM methods / 24

Error handling JAXP DOM Example // Get platform default implementation DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // Set options dbf.setnamespaceaware(true); dbf.setvalidating(true); // Create new builder DocumentBuilder db = dbf.newdocumentbuilder(); db.seterrorhandler(myerrorhandler); Document doc = db.parse("http://server.com/foo.xml"); // Use doc with usual DOM methods... 25

EntityResolver import org.xml.sax.entityresolver; public class MyResolver implements EntityResolver { public InputSource resolveentity(string publicid, String systemid) throws FileNotFoundException { if (publicid!=null) { if (publicid.equals("my public identifier")) { // return an input source object else return null; Utilisation : DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance(); DocumentBuilder parser = dfactory.newdocumentbuilder(); MyResolver myresolver = new MyResolver(); parser.setentityresolver(myresolver); Document DOMdoc = parser.parse(new File(xmlFile)); InputSource : S'il y a des résolutions en cascade, il faut que le parser puisse résoudre les appels relatifs 26 // return an input source object if (systemid.equals("http://www.foo.com/bar.dtd") { InputStream inputstream = new FileInputStream("/dtd/bar.dtd"); InputSource inputsource = new InputSource(inputStream); inputsource.setpublicid(publicid); inputsource.setsystemid(systemid); return inputsource;

Serialisation sérialisation arbre DOM document XML MSXML2.4.x node.xml; Apache Pas de maîtrise de l'identation, de l'encodage import org.apache.xml.serialize.xmlserializer; import org.apache.xml.serialize.outputformat; / OutputFormat formatter = new OutputFormat("xml", "utf-8", true); formatter.setpreservespace(true); XMLSerializer serializer = new XMLSerializer(System.out, formatter); serializer.serialize(); 27

XSLT dans JAXP // Get concrete implementation TransformerFactory tf = TransformerFactory.newInstance(); // Create a transformer for a particular stylesheet Transformer transformer = tf.newtransformer(new StreamSource(stylesheet)); // Transform input XML doc to System.out transformer.transform(new StreamSource(xmlSource), new StreamResult(System.out)); Document XML stream événements SAX TrAX : Transform API for XML Sources XML Sources XSLT Processeur XSLT Arbre de sortie Document XML stream événements SAX 28 arbre DOM javax.xml.transform.source +--javax.xml.transform.dom.domsource +--javax.xml.transform.sax.saxsource +--javax.xml.transform.stream.streamsource arbre DOM javax.xml.transform.result +--javax.xml.transform.dom.domresult +--javax.xml.transform.sax.saxresult +--javax.xml.transform.stream.streamresult

Serialisation avec XSLT // Get concrete implementation TransformerFactory tf = TransformerFactory.newInstance(); // Create the transformer for copying the source Transformer transformer = tf.newtransformer(); // Transform input XML doc to System.out transformer.transform(new DomSource(document), new StreamResult(System.out)); 29 L'objet transformer obtenu par TransformerFactory#newTransformer() correspond à la feuille de style de copie. On utilise ici le processeur XSLT uniquement à des fins de sérialisation Certains processeur XSLT peuvent aussi traiter des flux SAX : // un sérialiseur SAX public TransformerHandler getserializer(string output) throws TransformerConfigurationException { TransformerFactory factory = TransformerFactory.newInstance(); TransformerHandler transformerhandler = ((SAXTransformerFactory) factory).newtransformerhandler(); Result result = new StreamResult( output ); transformerhandler.setresult( result ); return transformerhandler;

Patron de programmation pour sérialiser un flux SAX import java.io.*; import java.util.*; import java.text.*; import org.xml.sax.*; import org.xml.sax.helpers.*; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.sax.*; import javax.xml.transform.stream.*; 30 public abstract class SaxUpdate extends XMLFilterImpl { // un filtre SAX public SaxUpdate() throws ParserConfigurationException, SAXException { // on crée le parser SAX SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setvalidating( true ); SAXParser saxparser = factory.newsaxparser(); XMLReader parser = saxparser.getxmlreader(); // on branche le filtre sur le parseur super.setparent( parser ); // un sérialiseur SAX public TransformerHandler getserializer(string output) throws TransformerConfigurationException { TransformerFactory factory = TransformerFactory.newInstance(); TransformerHandler transformerhandler = ((SAXTransformerFactory) factory).newtransformerhandler(); Result result = new StreamResult( output ); transformerhandler.setresult( result ); return transformerhandler;

Exemple de sérialisation d un flux SAX modifié Sérialiseur XSLT SAX Parser SAX Filter SAX Handler 31 document XML Exemple : on ajoute un attribut aux éléments SaxUpdate saxupdate = new SaxUpdate() { // concrète implémentation de SaxUpdate document XML modifié public void startelement(string uri, String localname, String qname, Attributes atts) throws SAXException { // on crée un nouvel attribut AttributesImpl attributes = new AttributesImpl( atts ); attributes.addattribute( "", "", "version", "CDATA", "1.0"); atts = attributes; // on transmet ce qui a été modifié au handler (le sérialiseur XSLT) this.getcontenthandler().startelement(uri, localname, qname, atts); ; // on se branche sur le sérialiseur saxupdate.setcontenthandler( saxupdate.getserializer( outputfilename ) ); // on veut récupérer les erreurs de parsing saxupdate.seterrorhandler( saxupdate.getparent().geterrorhandler() ); // on lance le parsing saxupdate.parse( inputfilename );

Architecture de XSLT dans JAXP 32

Architecture de XSLT dans Xalan Performance : avec Xalan, les feuilles de style peuvent être compilées Compiler XSLTC Translets Runtime processor 33 XSLT XSLTC (compilateur Xalan) Translets foo xml ns Runtime processor

Liaison XSLT entre JAXP et Xalan 34

XPath dans Xalan XPath API : permet de soumettre des expressions XPath à un node. import org.apache.xpath.xpathapi; / NodeList nodelist = XPathAPI.selectNodeList (node, expression1); Node node = XPathAPI.selectSingleNode (node, expression2); XObject xobj = XPathAPI.eval(node, expression3); xobj.gettype(); CLASS_BOOLEAN CLASS_NODESET CLASS_NULL CLASS_NUMBER CLASS_RTREEFRAG CLASS_STRING CLASS_UNKNOWN CLASS_UNRESOLVEDVARIABLE 35 Performance : les expressions XPath peuvent être compilées

XSLT côté serveur Sur un serveur Web, on peut être tenté de mettre en cache les feuilles de style pour réutilisation. Problème: plusieurs clients peuvent faire la même requête simultanément. 36 Les données sources ne sont que lues, mais les objets qui servent aux transformations peuvent subir des modifications : ce sont des objets "jetables". Avec JAXP, on peut mettre en cache les templates, et instancier à chaque requête des transformer. Exemple de servlet : public class MyServlet extends HttpServlet { public void init() throws ServletException { TransformFactory tf = TransformFactory.newInstance(); Templates mytemplate = tf.newtemplates(new StreamSource("style.xsl")); this.getservletcontext().setattribute("xslt", mytemplate); public doget(httpservletrequest req, HttpServletResponse resp) throws ServletException, IOException { String docname = req.getparameter("xml"); Templates mytemplate = (Templates) this.getservletcontext().getattribute("xslt"); Transformer transformer = mytemplate.newtransformer(); DOMResult res = new DOMResult(); String filename = this.getservletcontext().getrealpath(docname); transformer.transform(new StreamSource(fileName), res); /

37 JAXP String docname = req.getparameter("xml"); // Get concrete implementation TransformFactory tf = TransformFactory.newInstance(); // Create a transformer for a particular stylesheet Passage de paramètres avec XSLT Web Explorer adr http://www.foo.fr?xml=blah.xml&page=2 2 - Prérequis Le lecteur doit avoir une connaissance des blah approfondie. En particulier, il doit maîtriser les blah bleus et les blah de compétition. Transformer transformer = tf.newtransformer(new StreamSource(stylesheet)); // Set parameter transformer.setparameter("page", req.getparameter("page")); // Transform input XML doc to System.out String filename = this.getservletcontext().getrealpath(docname); transformer.transform(new StreamSource(docName), new StreamResult(System.out)); <?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform" > <xsl:param name="page" select="1"> <xsl:template match="/"> <html> <body> <xsl:apply-templates select="//section[number($page)]"/> </body> </html> </xsl:template> <xsl:template match="section"> <h1><xsl:apply-templates select="title"/></h1> <xsl:apply-templates/> </xsl:template> </xsl:stylesheet>

Passage de paramètres avec XSLT MSXML2 odoc=new ActiveXObject("MSXML2.DOMDocument.4.0"); odoc.async=false; odoc.load(xmldocument); oxsl=new ActiveXObject("MSXML2.FreeThreadedDOMDocument.4.0"); oxsl.async=false; oxsl.load(xsldocument); oxsl.setproperty("selectionlanguage", "XPath"); oxsl.setproperty("selectionnamespaces", 'xmlns:xsl="http://www.w3.org/1999/xsl/transform"'); otemplate=new ActiveXObject("Msxml2.XSLTemplate.4.0"); otemplate.stylesheet=oxsl; oprocessor = otemplate.createprocessor(); oprocessor.input = odoc; oprocessor.addparameter("page", pagenumber); oprocessor.transform(); result = oprocessor.output; 38

Extensions XSLT Transtypage d'un result-tree-fragment en node-set fonctionnalité très utile proposée dans de nombreuses implémentations <xsl:variable name="lieu"> Stade de France <nation>fr</nation> </xsl:variable> Xalan-Java <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform" xmlns:xalan="http://xml.apache.org"> / <xsl:apply-templates select="xalan:nodeset($lieu)/nation"/> / MSXML2.4.x <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"> / <xsl:apply-templates select="msxml:node-set($lieu)/nation"/> / 39

Scripts dans XSLT MSXSML.DOMDocument <xsl:script><![cdata[ function mafonction(node) { / return resultat; ]]></xsl:script> <xsl:template match=" / "> <xsl:eval>mafonction(this)</xsl:eval> </xsl:template> MSXML2.DOMDocument.4.x <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"> <msxsl:script language="jscript" implements-prefix="javascript"> function mafonction(nodelist) { / return resultat; </msxsl:script> <xsl:template match=" / "> <xsl:value-of select="javascript:mafonction(.)"/> </xsl:template> Obsolète 40

Scripts dans XSLT 41 Apache Xalan <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform" xmlns:lxslt="http://xml.apache.org/xslt" xmlns:user="http://mycompany.com/mynamespace" extension-element-prefixes="user"> <!--The component and its script are in the lxslt namespace and define the implementation of the extension.--> <lxslt:component prefix="user" elements="timelapse" functions="getdate"> <lxslt:script lang="javascript"> var multiplier=1; // The methods or functions that implement extension elements always take 2 // arguments. The first argument is the XSL Processor context; the second // argument is the element node. function timelapse(xslprocessorcontext, elem) { multiplier=parseint(elem.getattribute("multiplier")); return null; function getdate(numdays) { var d = new Date(); var totaldays = parseint(numdays) * multiplier; d.setdate(d.getdate() + totaldays); return d.tolocalestring(); </lxslt:script> </lxslt:component> <xsl:template match="deadline"> <p><user:timelapse multiplier="2"/>we have logged your enquiry and will respond by <xsl:value-of select="user:getdate(string(@numdays))"/>.</p> </xsl:template>

Choix d'un parser Dépend essentiellement de la plate-forme Dans tous les cas, bien connaître son parser : les options par défaut les paramétrages possibles les limitations vis à vis des standards les extensions propriétaires L'usage qu'on souhaite en avoir dans sa propre application Voir les documentations disponibles 42

Autres processeurs Spécialisés Batik FOP Processeur SVG Processeur XSLFO Propriétaires Ant Utilitaire de déploiement d'applications Java Cocoon Processeur XSP 43 Processeur "maison" : associé à des éléments ou des attributs qui dépendent d'un espace de nommage automate fichier de configuration

Pour quoi faire? N'en existe-t-il pas un qui fasse déjà le travail demandé? Conception de son processeur Castor http://castor.exolab.org JAXB 44 Conception : basée sur les techniques de data binding Définir son jeu de balises et d'attribut et l'espace de nommage Associer les structures XML à des classes Exemple <?xml version="1.0" encoding="iso-8859-1"?> <root> <foo param=" " /> <foo param=" "> <bar value=" " type=" "> Blah </bar> <foo param=" " /> </foo> <bar value=" " type=" "> Blah blah blah </bar> </root> try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setnamespaceaware(true); DocumentBuilder builder = factory.newdocumentbuilder(); Document doc = builder.parse(filename); Element root = doc.getdocumentelement(); RootAction rootaction = null; if (root.getnodename().equals("root")) { rootaction = RootAction.unmarshal(root); rootaction.run(); catch (ParserConfigurationException e) { // report configuration error catch (SAXException e) { // report parsing error catch (IOException e) { // report IO error

Conception de son processeur public class AbstractAction { Vector actions; AbstractAction parent; public static AbstractAction unmarshal(abstractaction parent, Element e) { for (Node n=e.getfirstchild(); n!=null; n=n.getnextsibling()) { if (n.getnodetype()==node.element_node) { if (n.getnodename().equals("foo")) { parent.addaction(fooaction.unmarshal((element) n)); else if (n.getnodename().equals("bar")) { parent.addaction(baraction.unmarshal((element) n)); return parent; private final void addaction(abstractaction action) { actions.add(action); action.parent = this; public void run() { // Execute all dependant abstract actions doitbefore(); for (Enumeration action = actions.elements() ; action.hasmoreelements() ;) { ((AbstractAction) action.nextelement()).run(); doitafter(); public void doitbefore() { public void doitafter() { 45

Conception de son processeur 46 public class FooAction extends AbstractAction { private String fooparam; // Creates a new instance of fooaction private FooAction() { actions = new Vector(); public static FooAction unmarshal(element e) { FooAction fooaction = new FooAction(); fooaction.fooparam = e.getattribute("param"); AbstractAction.unmarshal(fooAction, e); return fooaction; public void doitbefore() { // do foo actions before running dependant sub-actions public void doitafter() { // do foo actions after running dependant sub-actions public class RootAction extends AbstractAction { private RootAction() { actions = new Vector(); parent = null; public static RootAction unmarshal(element e) { RootAction root = new RootAction(); AbstractAction.unmarshal(root, e); return root; / Les actions peuvent être : connection à une base de données mise à jour d'une table envoi d'un mail On peut enrichir le code pour conditionner l'exécution d'une action en fonction du résultat de la précédente On peut réaliser des processeurs multi-threads dont le document XML est analysé à l'initialisation du programme, et exécuté pour chaque thread avec un jeu de données différent (attention à la façon d'isoler les données) servlet

XML Data Binding JAXB schema suit compile valide classes dérivées instances de unmarshal marshal document XML objets 47