
FAQ Java XMLConsultez toutes les FAQ
Nombre d'auteurs : 5, nombre de questions : 59, derni�re mise � jour : 3 septembre 2014 Ajouter une question
Cette FAQ a �t� r�alis�e � partir des questions fr�quemment pos�es sur les forums de http://www.developpez.com et de l'exp�rience personnelle des auteurs.
Nous tenons � souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne pr�tend pas non plus �tre compl�te. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant r�dacteur, lisez ceci.
- Comment fonctionne l'API XSLT ?
- Comment cr�er et configurer un Transformer (pour SAX et DOM) ?
- Que sont les Templates cr��s par TransformerFactory?
- Comment g�rer les erreurs durant la transformation ?
- Comment cr�er ou modifier un fichier XML avec DOM et XSLT ?
- Comment cr�er ou modifier un fichier XML avec SAX et XSLT ?
- Comment cr�er un fichier HTML � partir d'un XML ?
- Comment cr�er un fichier PDF � partir d'un XML ?
- Comment encha�ner les transformations XSLT ?
Architecture d'une application utilisant XSLT :
L'application commence par r�cup�rer un transformeur (javax.xml.transform.Transformer) � partir d'une fabrique de transformeurs (javax.xml.transform.TransformerFactory).
C'est ce transformeur qui va �tre charg� de transformer une source (javax.xml.transform.Source) en r�sultat (javax.xml.transform.Resultat). Par d�faut, si aucune v�ritable transformation n'est demand�e, le transformeur va simplement copier la source dans le r�sultat.
La source et le r�sultat peuvent �tre respectivement un parseur SAX, un DOM, une InputSource et un ensemble d'�v�nements SAX, un DOM ou une OutputSource.
Pour une configuration pratique du transformeur, regardez : Comment cr�er et configurer un Transformer (pour SAX et DOM) ?
Pour des exemples, regardez : Comment cr�er ou modifier un fichier XML avec DOM et XSLT ? et Comment cr�er ou modifier un fichier XML avec SAX et XSLT ?
Voici un exemple de cr�ation et de configuration d'un Transformer :
Code java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // cr�ation de la fabrique TransformerFactory fabrique = TransformerFactory.newInstance(); // r�cup�ration du transformeur Transformer transformer = fabrique.newTransformer(); /** * pour d�finir une feuille de style, vous pouvez utiliser une Source comme param�tre * File stylesheet = new File("stylesheet.xsl"); * StreamSource stylesource = new StreamSource(stylesheet); * Transformer transformer = fabrique.newTransformer(stylesource); */ // configuration du transformeur transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1"); |
Pour conna�tre toutes les clefs disponibles pour le Transformer, regardez la classe javax.xml.transform.OutputKeys.
Les fabriques de transformeurs (javax.xml.transform.TransformerFactory) peuvent construire deux types d'objets : les Transformer et les Templates.
Une Template est un � conteneur � de Transformer. De plus, contrairement � un simple Transformer, la Template est thread-safe (elle peut �tre utilis�e par plusieurs Threads sans risque).
La cr�ation et configuration d'une Template se font de la m�me mani�re que pour un Transformer. Par exemple :
Code java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | // cr�ation de la fabrique TransformerFactory fabrique = TransformerFactory.newInstance(); // r�cup�ration de Templates Templates template = fabrique.newTemplates(); /** * pour d�finir une feuille de style, vous pouvez utiliser une Source comme param�tre * File stylesheet = new File("stylesheet.xsl"); * StreamSource stylesource = new StreamSource(stylesheet); * Templates template = fabrique.newTemplates(stylesource); */ // configuration du transformeur Transformer transformer = template.getTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1"); |
La gestion des erreurs se fait de la m�me mani�re que pour SAX/DOM et les ErrorHandler. On peut g�rer les erreurs durant la transformation avec un ErrorListener (javax.xml.transform). Par exemple :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import javax.xml.transform.*; public class EcouteurDErreurs implements ErrorListener{ public void warning(TransformerException exception) throws TransformerException{ printException(exception); } public void error(TransformerException exception) throws TransformerException{ printException(exception); } public void fatalError(TransformerException exception) throws TransformerException{ printException(exception); throw exception; } private void printException(TransformerException exception){ String message = exception.getMessageAndLocation() ; System.out.println(message); } } |
Code java : | S�lectionner tout |
1 2 | Transformer transformeur = ...; transformeur.setErrorListener(new EcouteurDErreurs()); |
Voici une m�thode permettant de cr�er un fichier XML � partir d'un DOM :
Code java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public static void transformerXml(Document document, String fichier) { try { // Cr�ation de la source DOM Source source = new DOMSource(document); // Cr�ation du fichier de sortie FileOutputStream out = new File(fichier); Result resultat = new StreamResult(out); // Configuration du transformer TransformerFactory fabrique = TransformerFactory.newInstance(); Transformer transformer = fabrique.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1"); // Transformation transformer.transform(source, resultat); resultat.getOutputStream().close(); }catch(Exception e){ e.printStackTrace(); } } |
Pour cr�er un fichier XML avec SAX et XSLT, il nous faut cr�er une SAXSource. Nous allons prendre l'exemple de l'�criture dans un fichier d'un � annuaire � compos� d'une List de JavaBean Personne. Voici les �tapes n�cessaires � la cr�ation de la source :
- Cr�ation du bean : Personne d�finit un �l�ment de l'annuaire ;
- Cr�ation d'une InputSource :AnnuaireSource d�finit la List des personnes de l'annuaire ;
- Cr�ation d'un XMLReader : AnnuaireReader est capable de � parser � la source pour lever des �v�nements SAX ;
- Cr�ation de la SAXSource, � partir de l'InputSource et du Reader.
Apr�s cela la transformation se fera comme pour un arbre DOM et un fichier : avec un Transformer et un StreamResult (pour le fichier de destination).
Code Java : | S�lectionner tout |
1 2 3 | /**
* Voir zip
*/ |
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | public class AnnuaireSource extends InputSource{ private List<Personne> personnes; public AnnuaireSource(List<Personne> personnes){ super(); this.personnes = personnes; } public List<Personne> getPersonnes(){ return personnes; } // En fait, contrairement � cet exemple, de nombreuses m�thodes d'InputSource travaillent avec des streams. // Cela peut vous simplifier le travail sur des fichiers XML existants. } |
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | public class AnnuaireReader implements XMLReader{ private ContentHandler handler; private AttributesImpl atts = new AttributesImpl(); //m�thode qui vont �tre utilis�es par le transformer public ContentHandler getContentHandler(){ return handler; } public void setContentHandler(ContentHandler handler){ this.handler = handler; } // parsing d'une liste de personnes public void parse(InputSource input) throws IOException,SAXException{ if(!(input instanceof AnnuaireSource)){ String m = "Le seul argument possible pour parse est une AnnuaireSource"; throw new SAXException(m); } if(handler == null){ throw new SAXException("Pas de ContentHandler"); } AnnuaireSource source = (AnnuaireSource)input; List<Personne> personnes = source.getPersonnes(); handler.startDocument(); handler.startElement("", "annuaire", "annuaire", atts); for(Personne p : personnes){ atts.addAttribute("","id","id","",String.valueOf(p.getId())); handler.startElement("", "personne", "personne", atts); atts.clear(); handler.startElement("", "nom", "nom", atts); char[] nom = p.getNom().toCharArray(); handler.characters(nom,0,nom.length); handler.endElement("", "nom", "nom"); handler.startElement("", "prenom", "prenom", atts); char[] prenom = p.getPrenom().toCharArray(); handler.characters(prenom,0,prenom.length); handler.endElement("", "prenom", "prenom"); handler.startElement("", "adresse", "adresse", atts); char[] adresse = p.getAdresse().toCharArray() ; handler.characters(adresse,0,adresse.length); handler.endElement("", "adresse", "adresse"); handler.endElement("", "personne", "personne"); } handler.endElement("", "annuaire", "annuaire"); handler.endDocument(); } public void parse(String systemId) throws IOException,SAXException{ String m = "Le seul argument possible pour parse est une AnnuaireSource"; throw new SAXException(m); } // autres m�thodes � impl�menter } |
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | // Cr�ation de l'annuaire List<Personne> annuaire = new ArrayList<Personne>(); // ... //remplissage de l'annuaire // Cr�ation de la source DOM XMLReader annuaireReader = new AnnuaireReader(); InputSource annuaireSource = new AnnuaireSource(annuaire); Source source = new SAXSource(annuaireReader, annuaireSource); // Cr�ation du fichier de sortie File file = new File("CreationSAX.xml"); Result resultat = new StreamResult(file); // Configuration du transformer TransformerFactory fabrique = TransformerFactory.newInstance(); Transformer transformer = fabrique.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1"); // Transformation transformer.transform(source, resultat); |
La cr�ation d'un document HTML avec XSLT passe par l'utilisation d'une feuille de style (XSL). Voici le code � utiliser :
Code java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public static void creerHTML(String xml, String xsl, String html) throws Exception{ // Cr�ation de la source DOM DocumentBuilderFactory fabriqueD = DocumentBuilderFactory.newInstance(); DocumentBuilder constructeur = fabriqueD.newDocumentBuilder(); File fileXml = new File(xml); Document document = constructeur.parse(fileXml); Source source = new DOMSource(document); // Cr�ation du fichier de sortie File fileHtml = new File(html); Result resultat = new StreamResult(fileHtml); // Configuration du transformer TransformerFactory fabriqueT = TransformerFactory.newInstance(); StreamSource stylesource = new StreamSource(xsl); Transformer transformer = fabriqueT.newTransformer(stylesource); transformer.setOutputProperty(OutputKeys.METHOD, "html"); // Transformation transformer.transform(source, resultat); } |
L'API standard ne fournit pas de m�canisme pour transformer un XML en PDF. Par contre, une tr�s bonne librairie existe pour �a : FOP (Formatting Object Processor) . Voici un exemple d'utilisation de FOP :
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public static void creerPDF(String xml, String xsl, String pdf) throws Exception{ // cr�ation du r�sultat (pdf) Driver driver = new Driver(); driver.setRenderer(Driver.RENDER_PDF); driver.setOutputStream(new java.io.FileOutputStream(pdf)); Result resultat = new SAXResult(driver.getContentHandler()); // r�cup�ration de la source xml Source source = new StreamSource(xml); // cr�ation du transformer en fonction du xsl Source style = new StreamSource(xsl); TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(style); // transformation transformer.transform(source, resultat); } |
Vous pouvez tr�s bien vouloir encha�ner les transformations XSLT. Par encha�ner, on entend appliquer plusieurs transformations successives � un document XML. Chaque r�sultat de transformation devenant ainsi la source de la prochaine. Pour vous aider � faire ceci, le package org.xml.sax vous propose la classe XMLFilter. Voici le principe :
Voici une m�thode prenant en arguments un fichier XML, deux feuilles de style xsl (les transformations � encha�ner) et un fichier html de sortie.
Code Java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | public static void transformer(File xml, File xsl1, File xsl2, File html) throws Exception{ // Cr�ation du reader initial SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setNamespaceAware(true); XMLReader reader = spf.newSAXParser().getXMLReader(); // Cr�ation des filtres � appliquer au reader SAXTransformerFactory stf = (SAXTransformerFactory)TransformerFactory.newInstance(); XMLFilter filtre1 = stf.newXMLFilter(new StreamSource(xsl1)); XMLFilter filtre2 = stf.newXMLFilter(new StreamSource(xsl2)); // On "lie" le reader aux filtres filtre1.setParent(reader); filtre2.setParent(filtre1); // Cr�ation de la source : c'est le dernier filtre de la cha�ne // C'est lui qui indiquera au transformer quelles transformations � faire "avant" // Le r�sultat est le fichier HTML SAXSource source = new SAXSource(filtre2, new InputSource(new FileInputStream(xml))); StreamResult resultat = new StreamResult(new FileOutputStream(html)); //Transformation en cha�ne Transformer transformer = stf.newTransformer(); transformer.transform(source, resultat); } |
Proposer une nouvelle r�ponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plut�t sur le forum de la rubrique pour �aLes sources pr�sent�es sur cette page sont libres de droits et vous pouvez les utiliser � votre convenance. Par contre, la page de pr�sentation constitue une �uvre intellectuelle prot�g�e par les droits d'auteur. Copyright � 2025 Developpez Developpez LLC. Tous droits r�serv�s Developpez LLC. Aucune reproduction, m�me partielle, ne peut �tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'� trois ans de prison et jusqu'� 300 000 � de dommages et int�r�ts.