Les technologies XML Cours 3 : Les API XML Novembre 2013 - Version 4.0 - 1 LES API POUR MANIPULER DES DOCUMENTS XML Les API XML sont : des librairies proposant un ensemble de composants logiciels facilitant la lecture, la génération et le traitement de documents XML. Ces API sont implémentées sur la base de 2 modèles : le DOM XML (Document Objet Model) permettant la manipulation d’un document XML après l’avoir représenté en mémoire sous la forme d’un arbre d’objets, le modèle SAX (Simple API for XML) permettant la manipulation d’un document XML au fur et à mesure de la lecture de celui-ci. L’extraction des données est basée sur une gestion d’événements (création d’un document, d’un 2 élément ...). API Java pour XML 1/3 JAXP: Java API for XML Processing proposé par JavaSoft (http://java.sun.com/xml/jaxp/) et présent depuis java2 version 1.4. Unification des approches SAX & DOM Proposition d'une API standard pour les transformations de documents XML (processeurs XSLT, XSL-FO et XPATH). API Java pour XML 2/3 Les différentes classes des API XML : 4 API Java pour XML 3/3 JAXP: Java API for XML Processing : L’API javax.xml.parsers permet d’obtenir des instances d’un parseur DOM ou d’un parseur SAX. C’est en effet l’étape préliminaire à toute manipulation de document XML. Un parseur a pour rôle d’analyser un document XML. Un parseur / valideur peut en outre vérifier la validité d’un document en fonction de sa DTD ou du XML-Schema associé, le cas échéant au document XML 5 Simple API for XML 1/9 Principes Référence : http://www.saxproject.org Objectifs : Simplifier l'accès aux analyseurs, Rendre l'application indépendante des analyseurs, L'analyse génère des évènements récupérés par SAX et passés à l'application. 6 Simple API for XML 2/9 L’API org.xml.sax : Elle implémente les interfaces SAX et fournit des classes et des méthodes permettant la manipulation d’un document XML via une gestion d’événements. Le parseur analyse le flot de caractères du document et appelle des méthodes dites de Callback lors qu’il rencontre les balises de début et de fin du document et d’éléments 7 Simple API for XML 3/9 Exemple d’un lecteur SAX : 8 Simple API for XML 4/9 Exemple d’un lecteur SAX (suite) : Ce premier exemple est un parseur de type SAX qui se contente de détecter les différents balises et attributs contenus dans un document XML et d’effectuer un traitement associé. Pour se faire, la classe principale hérite de la classe DefaultHandler. Cette classe fournit en effet un certain nombre de méthodes capable de gérer les événements liées à l’analyse d’un document XML : startElement gère l’évènement début d’un élément, startDocument gère l’événement début d’un document, endDocument gére l’événement fin d’un document... Une fois, l’instance d’un parseur de type SAXParser obtenue, il faut ensuite, à l’aide de la méthode parse, associer la source de données XML (passée en paramètre) au flux d’évènements gérés par les méthodes des classes DefaultHandler. 9 Simple API for XML 5/9 Les packages Java de SAX 2 Les interfaces du package org.xml.sax: ContentHandler évènements liés au contenu DTDHandler évènements liés à la DTD ErrorHandler récupération des erreurs Locator récupération de la position XMLReader analyseur | XMLFilter Attributes EntityResolver Les classes du package org.xml.sax.helpers: org.xml.sax.helpers.DefaultHandler implements org.xml.sax.ContentHandler, implements org.xml.sax.DTDHandler, implements org.xml.sax.EntityResolver, implements org.xml.sax.ErrorHandler Simple API for XML 6/9 SAX: Premier programme import java.io.FileReader; import org.xml.sax.XMLReader; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.helpers.XMLReaderFactory; public class Essai extends org.xml.sax.helpers.DefaultHandler { public Essai () { super(); } public static void main (String args[]) throws Exception { // XMLReader xr = new org.apache.xerces.parsers.SAXParser(); XMLReader xr = XMLReaderFactory.createXMLReader(); Essai handler = new Essai(); xr.setContentHandler(handler); xr.setErrorHandler(handler); xr.setFeature("http://xml.org/sax/features/validation",true); for (int i = 0; i < args.length; i++) { FileReader r = new FileReader(args[i]); xr.parse(new InputSource(r)); } } Simple API for XML 7/9 SAX: Le gestionnaire de contenu public void startDocument () { System.out.println("Start document"); } public void endDocument () { System.out.println("End document"); } public void startElement (String uri, String name, String qName, Attributes atts) { System.out.println("Start element: " + uri + "," + name); } public void endElement (String uri, String name, String qName) { System.out.println("End element: " + uri + "," + name); } Simple API for XML 8/9 SAX: Le gestionnaire de contenu (suite) public void characters (char ch[], int start, int length) { System.out.print("Characters: "); for (int i = start; i < start + length; i++) { System.out.print(ch[i]); break; } System.out.println(); } Simple API for XML 9/9 SAX: Le gestionnaire des erreurs public void error(SAXParseException e) { System.err.println("Erreur non fatale (ligne " + e.getLineNumber() + ", col " + e.getColumnNumber() + ") : " + e.getMessage()); } public void fatalError(SAXParseException e) { System.err.println("Erreur fatale : " + e.getMessage()); } public void warning(SAXParseException e) { System.err.println("warning : " + e.getMessage()); } Document Object Model 1/9 Représentation Objet en mémoire d'un document XML ou HTML (4.01). C'est une norme proposée par le consortium W3C (http://www.w3.org/DOM/). Le DOM se compose de deux parties: DOM noyau (Core DOM) pour XML, DOM HTML. Document Object Model 2/9 L’API org.xml.dom : Elle implémente les interfaces DOM et fournit des classes et des méthodes permettant la manipulation d’un document XML via une gestion d’arbre. On peut ainsi ajouter ou supprimer un nœud, ajouter ou supprimer un attribut à un nœud (méthodes appendChild, setAttribute de la classe Element par exemple)... Un parseur DOM construit un objet DOM, puis parcours en largeur et en profondeur l’arbre afin d’en traiter chaque nœud. 16 Document Object Model 6/9 DOM: Le package Java org.w3c.dom Les interfaces du package org.w3c.dom: Node | Attr | CharacterData | | Comment | | Text | | | CDATASection | Document | DocumentFragment | DocumentType | Element | Entity | EntityReference | Notation | ProcessingInstruction NamedNodeMap NodeList Document Object Model 7/9 Node getFirstChild() Node getNextSibling() Node getLastChild() Node getPreviousSibling() Node getParentNode() NodeList getChildNodes() boolean hasChildNodes() Document getOwnerDocument() NamedNodeMap getAttributes() boolean hasAttributes() String getLocalName() String getNamespaceURI() String getNodeName() String getPrefix() short getNodeType() String getNodeValue() Node appendChild(Node newChild) Node insertBefore(Node newChild, Node refChild) Node removeChild(Node oldChild) Node replaceChild(Node newChild, Node oldChild) void setNodeValue(String nodeValue) void setPrefix(String prefix) Node cloneNode(boolean deep) Document Object Model 8/9 DOM: Premier générateur DOM Déclaration de l'analyseur XML et création du document: import org.w3c.dom.*; import javax.xml.parsers.*; import java.io.*; public class Exemple { public static void main(String[] args) throws Exception { Document doc; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); // valide les documents au cours de l'analyse DocumentBuilder db = dbf.newDocumentBuilder(); doc = db.parse(new File(args[0])); afficher("", doc); } } Document Object Model 9/9 DOM: Premier générateur DOM (2) Parcours de l'arbre XML: public static void afficher(String indent, Node n) { switch (n.getNodeType()) { case org.w3c.dom.Node.COMMENT_NODE: System.out.println(indent + "<!­­" + n.getNodeValue() + " ­­>"); break; case org.w3c.dom.Node.TEXT_NODE: System.out.println(indent + ((CharacterData) n).getData() ); break; case org.w3c.dom.Node.ELEMENT_NODE: System.out.println(indent + "<" + ((Element) n).getTagName() + ">"); break; } NodeList fils = n.getChildNodes(); for(int i=0; (i < fils.getLength()); i++) afficher(indent + " | ", fils.item(i)); if (n.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) System.out.println(indent + "</" + ((Element) n).getTagName() + ">"); } Document Object Model 3/9 Exemple d’un 2nd générateur DOM : 21 Document Object Model 4/9 Exemple d’un 2nd générateur DOM (suite) : 22 Document Object Model 5/9 Exemple d’un 2nd générateur DOM (fin) : 23 CONCLUSION : SAX VERSUS DOM SAX ou DOM ? 24 XSLT en Java Exemple de transformation de document XML : On dispose d’un fichier source input.xml et d’une fiche XSLT input.xsl, et on désire créer un fichier output.html à partir de ces deux éléments. 25 JDOM : alternative à SAX/DOM/JAXP Objectifs : offrir une bibliothèque de classes simple pour la représentation et la manipulation de documents XML (http://www.jdom.org). public static void main(String[] args) { org.jdom.Element stock = new org.jdom.Element("stock") .addContent(new org.jdom.Element("nom").setText("CD")) .addContent(new org.jdom.Element("prix").setText("100")); org.jdom.Document root = new org.jdom.Document(stock); org.jdom.output.XMLOutputter outputter = new org.jdom.output.XMLOutputter(); try { outputter.output(root, System.out); } catch (java.io.IOException e) { } } JDOM: alternative à SAX/DOM/JAXP Des passerelles sont disponibles vers : la représentation DOM, les évènements SAX, les analyseurs compatibles SAX/DOM, les processeurs XSL compatibles JAXP. D'autres alternatives existent : DOM4J XOM