java:xml
Différences
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
java:xml [2014/02/17 20:54] – créée bruno | java:xml [2014/02/18 13:39] (Version actuelle) – [XML en deux mots...] bruno | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== | + | ====== |
Ce TP est une **introduction** à XML et XSL. | Ce TP est une **introduction** à XML et XSL. | ||
Ligne 6: | Ligne 6: | ||
Si vous souhaitez en apprendre plus, la dernière section "Pour approfondir ce qui vient d' | Si vous souhaitez en apprendre plus, la dernière section "Pour approfondir ce qui vient d' | ||
+ | {{: | ||
+ | ===== XML en deux mots... ===== | ||
+ | XML est un format de représentation de données. C'est à dire qu'il offre une manière particulière de stocker des données. | ||
+ | |||
+ | XML utilise des représentations sous forme d' | ||
+ | |||
+ | Ce qu'XML représente, | ||
+ | |||
+ | Regardez le document document1.xml de l' | ||
+ | - **quel est le noeud racine?** | ||
+ | - **donnez quelques noeuds de type feuille** | ||
+ | - **donnez quelques noeuds contenant d' | ||
+ | |||
+ | Un noeud peut également contenir des propriétés (attribute) qui sont spécifiés lors de la déclaration sous forme de pair-valeur: | ||
+ | |||
+ | <code xml> | ||
+ | < | ||
+ | contenu du noeud | ||
+ | <!-- un commentaire --> | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Un format XML peut être décrit dans une DTD ou un schema XML: ces documents expliquent comment un document doit être organisé. | ||
+ | |||
+ | Regardez par exemple la DTD et le schema proposé dans l' | ||
+ | |||
+ | **Quel format XML connaissez-vous déjà** ? | ||
+ | |||
+ | **Inventez un petit format XML** ? | ||
+ | |||
+ | |||
+ | ===== XML et les API java ===== | ||
+ | Java offre plusieurs API permettant de manipuler des fichiers XML. | ||
+ | |||
+ | Nous vous en présentons deux par l' | ||
+ | ==== SAX ==== | ||
+ | L'API SAX de java permet d' | ||
+ | |||
+ | Prenez en main le code suivant: | ||
+ | |||
+ | <code java> | ||
+ | package sax; | ||
+ | import org.xml.sax.Attributes; | ||
+ | import org.xml.sax.Locator; | ||
+ | import org.xml.sax.helpers.DefaultHandler; | ||
+ | |||
+ | /** | ||
+ | * Handler trivial pour SAX | ||
+ | * Ce handler se contente d' | ||
+ | * @author O. Carton | ||
+ | * @version 1.0 | ||
+ | */ | ||
+ | public class TrivialSAXHandler extends DefaultHandler { | ||
+ | | ||
+ | | ||
+ | " | ||
+ | " systemId=" | ||
+ | } | ||
+ | | ||
+ | | ||
+ | } | ||
+ | | ||
+ | | ||
+ | } | ||
+ | | ||
+ | String localname, | ||
+ | String qualname, | ||
+ | Attributes | ||
+ | | ||
+ | " | ||
+ | " localname=" | ||
+ | " qualname=" | ||
+ | } | ||
+ | | ||
+ | String localname, | ||
+ | String qualname) { | ||
+ | | ||
+ | " | ||
+ | " localname=" | ||
+ | " qualname=" | ||
+ | } | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | et la classe principale: | ||
+ | |||
+ | <code java> | ||
+ | package sax; | ||
+ | // IO | ||
+ | import java.io.InputStream; | ||
+ | import java.io.FileInputStream; | ||
+ | // SAX | ||
+ | import javax.xml.parsers.SAXParserFactory; | ||
+ | import javax.xml.parsers.SAXParser; | ||
+ | |||
+ | /** | ||
+ | * Lecture triviale d'un document XML avec SAX | ||
+ | * @author O. Carton | ||
+ | * @version 1.0 | ||
+ | */ | ||
+ | public class TrivialSAXRead { | ||
+ | | ||
+ | | ||
+ | { | ||
+ | // Création de la fabrique de parsers | ||
+ | | ||
+ | // Création du parser | ||
+ | | ||
+ | |||
+ | // Lecture de chaque fichier passé en paramètre | ||
+ | | ||
+ | // Flux d' | ||
+ | | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | - lisez et comprenez le code | ||
+ | - qu' | ||
+ | - qu' | ||
+ | - que fait ce code? | ||
+ | - testez ce code avec le fichier document1.xml: | ||
+ | - testez ce code avec document2.xml: | ||
+ | - modifiez le code pour compter le nombre de mots et le nombre de phrases d'un document xml. | ||
+ | - est-il possible de modifier ce code pour poursuivre le traitement du document1? Pourquoi? Comment? | ||
+ | ==== DOM ==== | ||
+ | L'API DOM de java permet de charger complètement et d'un seul coup un document XML en mémoire | ||
+ | |||
+ | Prenez en main le code suivant: | ||
+ | |||
+ | <code java> | ||
+ | package dom; | ||
+ | |||
+ | //IO | ||
+ | import java.io.InputStream; | ||
+ | import java.io.FileInputStream; | ||
+ | //DOM | ||
+ | import javax.xml.parsers.DocumentBuilderFactory; | ||
+ | import javax.xml.parsers.DocumentBuilder; | ||
+ | import org.w3c.dom.Document; | ||
+ | |||
+ | /** | ||
+ | * Lecture triviale d'un document XML avec DOM | ||
+ | * @author O. Carton | ||
+ | * @version 1.0 | ||
+ | */ | ||
+ | public class TrivialDOMRead { | ||
+ | public static void main(String [] args) | ||
+ | throws Exception | ||
+ | { | ||
+ | // Création de la fabrique de constructeur de documents | ||
+ | DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); | ||
+ | // Création du constructeur de documents | ||
+ | DocumentBuilder documentBuilder = dbf.newDocumentBuilder(); | ||
+ | |||
+ | // Lecture de chaque fichier passé en paramètre | ||
+ | for(int i = 0; i < args.length; | ||
+ | // Flux d' | ||
+ | | ||
+ | // Construction du document | ||
+ | | ||
+ | // Exploitation du document ... | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | - lisez et comprenez le code | ||
+ | - que fait ce code? | ||
+ | - testez ce code avec le fichier document1.xml: | ||
+ | - testez ce code avec document2.xml: | ||
+ | - modifiez le code pour compter le nombre de mots et le nombre de phrases d'un document xml. | ||
+ | - est-il possible de modifier ce code pour poursuivre le traitement du document1? Pourquoi? Comment? | ||
+ | - quels différences y a-t-il avec l'API SAX? | ||
+ | |||
+ | ==== Modification et écriture ==== | ||
+ | SAX et DOM offrent de nombreuses méthodes pour créer des document XML, les exploiter, les modifier, les sauvegarder, | ||
+ | |||
+ | Reagrdez le code suivant: | ||
+ | |||
+ | <code java> | ||
+ | try | ||
+ | { | ||
+ | // Création d'un nouveau DOM | ||
+ | DocumentBuilderFactory fabrique =DocumentBuilderFactory.newInstance(); | ||
+ | DocumentBuilder constructeur = fabrique.newDocumentBuilder(); | ||
+ | Document document = constructeur.newDocument(); | ||
+ | // Propriétés du DOM | ||
+ | document.setXmlVersion(" | ||
+ | document.setXmlStandalone(true); | ||
+ | //Création de l' | ||
+ | /racine | ||
+ | Element racine = document.createElement(" | ||
+ | racine.setAttribute(" | ||
+ | Element fils = document.createElement(" | ||
+ | // ajout du fils à la racine | ||
+ | racine.appendChild(obs); | ||
+ | //ajout de la racine au document | ||
+ | document.appendChild(racine); | ||
+ | /* Sauvegarde du fichier xml */ | ||
+ | Source source = new DOMSource(document); | ||
+ | // Création du fichier de sortie | ||
+ | File f = new File(" | ||
+ | Result resultat = new StreamResult(f); | ||
+ | // Configuration du transformer | ||
+ | TransformerFactory tfabrique = TransformerFactory.newInstance(); | ||
+ | Transformer transformer = tfabrique.newTransformer(); | ||
+ | transformer.setOutputProperty(OutputKeys.INDENT, | ||
+ | transformer.setOutputProperty(OutputKeys.ENCODING, | ||
+ | // Transformation | ||
+ | transformer.transform(source, | ||
+ | } | ||
+ | catch (ParserConfigurationException pce) {pce.printStackTrace(); | ||
+ | catch (TransformerConfigurationException tce) {tce.printStackTrace(); | ||
+ | catch (TransformerException te) {te.printStackTrace(); | ||
+ | |||
+ | </ | ||
+ | - regardez la spécification des API | ||
+ | - créez un document XML au format que vous avez défini en première partie avec sax puis avec dom | ||
+ | - essayer de modifier ce document: quelle API vous semble la plus efficace? | ||
+ | |||
+ | ===== XSL en deux mots... ===== | ||
+ | XSL est un langage XML de transformation de document XML. | ||
+ | |||
+ | XSL utilise une approche événementielle pour le traitement des document XML. | ||
+ | |||
+ | Regardez le fichier transfo1.xsl. Que fait ce fichier? Comment utiliser ce fichier sur un document XML? | ||
+ | |||
+ | |||
+ | ===== XSL et java ===== | ||
+ | |||
+ | Java permet l' | ||
+ | |||
+ | Regardez le code suivant: | ||
+ | |||
+ | <code java> | ||
+ | DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); | ||
+ | // | ||
+ | factory.setNamespaceAware(true); | ||
+ | factory.setValidating(true); | ||
+ | factory.setIgnoringElementContentWhitespace(true); | ||
+ | factory.setIgnoringComments(true); | ||
+ | factory.setIgnoringElementContentWhitespace(false); | ||
+ | try | ||
+ | { | ||
+ | //sinon, génère parfois des null pointer exp au parsage (problème avecsimples quote) | ||
+ | factory.setFeature(" | ||
+ | false); | ||
+ | DocumentBuilder builder = factory.newDocumentBuilder(); | ||
+ | Document doc = builder.parse(new File(entree)); | ||
+ | doc.setStrictErrorChecking(true); | ||
+ | TransformerFactory transformFactory = new TransformerFactoryImpl(); | ||
+ | StreamSource styleSource = new StreamSource(new File(ADRESSE_XSL)); | ||
+ | // lire le style | ||
+ | Transformer transform = transformFactory.newTransformer(styleSource); | ||
+ | //Si besoin : transform.setOutputProperty(name, | ||
+ | DOMSource in = new DOMSource(doc); | ||
+ | // Création du fichier de sortie | ||
+ | File file = new File(cible); | ||
+ | Result resultat = new StreamResult(fichier); | ||
+ | //Si besoin : transform.setParameter(" | ||
+ | transform.transform(in, | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | - Quelle API de java est utilisée? | ||
+ | - Où est déclarée la feuille de style (de transformation) XSL? | ||
+ | |||
+ | Regardez la documentation de la fonction **count** de XSL. | ||
+ | |||
+ | - faites un programme permettant de compter le nombre de mots et le nombre de phrase d'un document XML. Le résultat sera stocké dans un fichier texte simple. | ||
+ | - regardez la feuille de style document.xsl: | ||
+ | - essayez de la modifier pour changer le rendu du document document2.xml | ||
+ | |||
+ | **Quelle technique vous semble la plus facile à utiliser?** | ||
+ | |||
+ | ===== Pour approfondir ce qui vient d' | ||
+ | |||
+ | - FAQ sur XML et JAVA: [[http:// | ||
+ | - sur XML et un peu java: [[http:// | ||
+ | - XML, XSL, un peu java: [[http:// | ||
+ | - le meilleur site sur les FAQ XSL de Dave Pawson:[[ http:// | ||
+ | - tutoriel xsl:[[ http:// | ||
+ | - reférences XSL: [[http:// |
java/xml.1392670452.txt.gz · Dernière modification : 2014/02/17 20:54 de bruno