IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)



Quelle est la différence entre SAX et DOM ?
auteur : Clément Cunin
Comme dans de nombreux langages, il existe 2 grandes familles de solutions pour lire un fichier XML avec Java: SAX (Simple API for XML) et DOM (Document Object Model).

Le principe de SAX.
Cette solution est très pratique pour relire des fichiers XML simples. L'analyseur SAX s'occupe d'interpréter le document XML, identifiant les différentes balises et attributs. Dès qu'un élément est reconnu, SAX avertit notre programme afin que celui-ci fasse un traitement approprié. Le programme reçoit donc des évènements du type "ouverture de la balise X", "zone de texte", "fermeture de la balise".

NOTE : Après le passage de SAX, seules restent les informations que le programmeur à lui même traitées et placées dans d'autres structures de données.

Le principe de DOM.
Cette solution est plus simple à comprendre, elle lit l'intégralité du document XML afin de construire sa représentation en mémoire. Ensuite le programme peut ensuite librement et rapidement parcourir cette représentation interne pour y garder les informations souhaitées.

Quand utiliser qui ?
Pas de solution miracle à cette question. Il est courrant de penser que DOM est plus pratique que SAX car il construit une représentation du document alors qu'avec SAX, le programmeur doit traiter lui-même les données. SAX est très pratique pour lire des documents à la structure simple, un fichier XML de configuration d'une application par exemple... plus le nombre de balises différentes augmente, plus un code basé sur SAX devient difficile à comprendre. SAX peut aussi être utile pour gérer des documents XML de grande taille (Là où DOM entraînerait une grande consommation de mémoire) ou en provenance de source lente (lecture d'un document par le réseau) car l'interprétation des données se fait au fur et à mesure de la lecture du document.

lien : Comment lire un document XML (DOM) ?
lien : Comment lire un document XML (SAX) ?

Comment lire un document XML (SAX) ?
auteur : Nicolas Cuny
Il faut utiliser <javaClass class="javax.xml.parsers.SAXParser"/>.

trySAXParserFactory usine = SAXParserFactory.newInstance();SAXParser analyseur = usine.newSAXParser();analyseur.parse(new File("mon_fichier.xml", new DefaultHandler() <comment>redéfinir ici les méthodes de ContentHandler</comment>); catch (Exception e) e.printStackTrace();
lien : Quelle est la différence entre SAX et DOM ?

Comment lire un document XML (DOM) ?
auteur : Nicolas Cuny
Il faut utiliser <javaClass class="javax.xml.parsers.DocumentBuilder"/>.

tryDocumentBuilderFactory usine = DocumentBuilderFactory.newInstance();DocumentBuilder constructeur = usine.newDocumentBuilder();Document document = analyseur.parse(new File("mon_fichier.xml"); catch (Exception e) e.printStackTrace();
lien : Quelle est la différence entre SAX et DOM ?

Comment transformer un document XML ?
auteur : Nicolas Cuny
Le paquetage <javaPackage package="javax.xml.transform"/> permet de transformer un document XML d'une forme à l'autre, d'une source vers un résultat. Il existe trois formes : document DOM, évènements SAX et fichier.

Création d'un transformateur
La première étape est de créer une classe appelée transformateur (<javaClass class="javax.xml.transform.Transformer"/>). Ceci est réalisé au moyen du design pattern (patron de conception) Factory Method.

import javax.xml.transform.TransformerFactory;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerConfigurationException;[...]try<comment> il convient d'abord d'instancier l'usine ...</comment>TransformerFactory usine = TransformerFactory.newInstance();<comment>qui permet d'instancier le transformateur</comment>Transformer transformeur = usine.newTransformer();catch (TransformerConfigurationException e)e.printStackTrace();
Configuration du transformateur
Le transformateur se configure en lui attribuant des propriétés via la méthode <javaMethode class="javax.xml.transform.Transformer" methode="setOutputProperty(java.lang.String, java.lang.String)"/> : son premier argument est une constante définie dans la classe <javaClass class="javax.xml.transform.OutputKeys"/>, le second est la valeur de la propriété.

import javax.xml.transform.OutputKeys;<comment>on lui attribue certaines propriétés</comment>transformeur.setOutputProperty(OutputKeys.ENCODING, "UTF-8");transformeur.setOutputProperty(OutputKeys.INDENT, "yes");transformeur.setOutputProperty(OutputKeys.METHOD, "xml");transformeur.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");transformeur.setOutputProperty(OutputKeys.STANDALONE, "yes");transformeur.setOutputProperty(OutputKeys.VERSION, "1.0");
Transformation du document XML
La transformation est réalisée par l'appel à la méthode <javaMethode class="javax.xml.transform.Transformer" methode="transform(javax.xml.transform.Source, javax.xml.transform.Result)"/>. Le premier paramètre doit implanter l'interface <javaInterface class="javax.xml.transform.Source"/> et le second l'interface <javaInterface class="javax.xml.transform.Result"/>. Des implantations de ces interfaces sont fournies dans les sous-paquetages pour chacune des trois formes de document XML (<javaPackage package="javax.xml.transform.dom"/>, <javaPackage package="javax.xml.transform.sax"/> et <javaPackage package="javax.xml.transform.stream"/>).

Exemple de transformation : DOM vers fichier

import javax.xml.transform.TransformerFactory;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerConfigurationException;import javax.xml.transform.TransformerException;import javax.xml.transform.OutputKeys;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;[...]tryTransformerFactory usine = TransformerFactory.newInstance();Transformer transformeur = usine.newTransformer();transformeur.setOutputProperty(OutputKeys.ENCODING, "UTF-8");transformeur.setOutputProperty(OutputKeys.INDENT, "yes");transformeur.setOutputProperty(OutputKeys.METHOD, "xml");transformeur.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");transformeur.setOutputProperty(OutputKeys.STANDALONE, "yes");transformeur.setOutputProperty(OutputKeys.VERSION, "1.0");transformeur.transform(new DOMSource(document), new StreamResult(fichier));catch (TransformerConfigurationException e)e.printStackTrace();catch (TransformerException e)e.printStackTrace();


Ce document issu de http://www.developpez.com est soumis à la licence GNU FDL traduit en français ici.
Permission vous est donnée de distribuer, modifier des copies de cette page tant que cette note apparaît clairement.