L`API org.xml.sax

publicité
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
Téléchargement