java:xml
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| java:xml [2014/02/18 12:29] – [XML en deux mots...] bruno | java:xml [2014/02/18 13:39] (Version actuelle) – [XML en deux mots...] bruno | ||
|---|---|---|---|
| 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 en deux mots... ===== | ||
| Ligne 28: | Ligne 29: | ||
| </ | </ | ||
| </ | </ | ||
| + | |||
| + | 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 ===== | ===== XML et les API java ===== | ||
| + | Java offre plusieurs API permettant de manipuler des fichiers XML. | ||
| + | Nous vous en présentons deux par l' | ||
| ==== SAX ==== | ==== 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 ==== | ==== 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 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 ===== | ===== XSL et java ===== | ||
| - | ===== Exercices guidés | + | Java permet l' |
| + | |||
| + | Regardez le code suivant: | ||
| + | |||
| + | <code java> | ||
| + | DocumentBuilderFactory factory | ||
| + | // | ||
| + | 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 | ||
| + | Document doc = builder.parse(new File(entree)); | ||
| + | doc.setStrictErrorChecking(true); | ||
| + | TransformerFactory transformFactory | ||
| + | StreamSource styleSource | ||
| + | // lire le style | ||
| + | Transformer transform | ||
| + | //Si besoin : transform.setOutputProperty(name, | ||
| + | DOMSource in = new DOMSource(doc); | ||
| + | // Création du fichier de sortie | ||
| + | File file = new File(cible); | ||
| + | Result resultat | ||
| + | //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' | ===== Pour approfondir ce qui vient d' | ||
java/xml.1392726589.txt.gz · Dernière modification : 2014/02/18 12:29 de bruno