Java & XML
Table des matieres
1 SAX (Simple API for XML) 2
1.1 Principes de SAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Les packages Java de SAX 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 Premier programme SAX2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4 Appel de l’analyseur SAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.5 Debut et fin d’analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.6 Le gestionnaire de contenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.7 Traiter les caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.8 Traiter les erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2 L’API DOM (Document Object Model) 11
2.1 Le package Java org.w3c.dom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2 L’interface Node . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3 Premier programme DOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4 Premier programme DOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.5 Parcours d’un arbre DOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3 JAXP (Java API for XML Processing) 17
3.1 Une usine a analyseurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.2 Une usine a analyseurs (suite) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.3 Les analyseurs JAXP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.4 Une usine pour transformer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.5 Les transformations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.6 Un exemple de transformation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4 Les alternatives a SAX/DOM/JAXP 24
4.1 La librairie JDOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.2 La librairie DOM4J . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
5 JAXB (Java API for XML Binding) 27
5.1 Compilation d’un DTD/schema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.2 Lecture d’un fichier XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
5.3 Generation de documents XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
1
1 SAX (Simple API for XML)
reference : http://www.saxproject.org
Auteur : David Megginson.
Version : 2.0.1.
L’interface de programmation SAX propose une vision evenementielle de l’analyse d’un document XML.
2
1.1 Principes de SAX
plugin
SAX
nanoXML
plugin
SAX
xp
plugin
SAX
Crimson
plugin
SAX
Xerces
SAXApplication
Objectifs :
• Simplifier l’acces aux analyseurs,• Rendre l’application independante des analyseurs,
L’analyse genere des evenements recuperes par SAX et passes a l’application.
3
1.2 Les packages Java de SAX 2
Les interfaces du package org.xml.sax :
ContentHandler evenements lies au contenu
DTDHandler evenements lies a la DTD
ErrorHandler recuperation des erreurs
Locator recuperation de la position
XMLReader Analyseur
| XMLFilter
AttributeList
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
...
4
1.3 Premier programme SAX2
package exemples;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
public class SaxSample extends DefaultHandler {
int nbElements = 0;
int nbCharacters = 0;
// methodes d’analyse et de traitement des evenements
...
}
5
1.4 Appel de l’analyseur SAX
public void parseXmlFile(String fileName) throws Exception {
// creer un analyseur SAX par defaut
XMLReader xr = XMLReaderFactory.createXMLReader();
// fixer le(s) gestionnaire(s) d’evenements
xr.setContentHandler(this);
xr.setErrorHandler(this);
// xr.setDTDHandler(this);
// fixer les comportements
xr.setFeature("http://xml.org/sax/features/validation", true);
// analyser la source XML
xr.parse(new InputSource(fileName));
}
6
1.5 Debut et fin d’analyse
// Travail a faire en debut d’analyse
@Override
public void startDocument() {
nbElements = 0;
nbCharacters = 0;
}
// Travail a faire en fin d’analyse
@Override
public void endDocument() {
System.out.println();
System.out.println("nbElements = " + nbElements);
System.out.println("nbCharacters = " + nbCharacters);
}
7
1.6 Le gestionnaire de contenu
@Override
public void startElement(String uri, String name, String qName,
Attributes atts) {
System.out.println("<" + qName + ">");
nbElements++;
}
Travail a faire : preparer le stockage ou le traitement des donnees.
@Override
public void endElement(String uri, String name, String qName) {
System.out.println("</" + qName + ">");
}
Travail a faire : terminer le stockage ou le traitement.
8
1.7 Traiter les caracteres
@Override
public void characters(char ch[], int start, int length) {
nbCharacters += (length);
for (int i = start; i < start + length; i++) {
switch (ch[i]) {
case ’&’:
System.out.print("&");
break;
case ’<’:
System.out.print("<");
break;
case ’>’:
System.out.print(">");
break;
default:
System.out.print(ch[i]);
break;
}
}
}
9
1.8 Traiter les erreurs
@Override
public void error(SAXParseException e) {
System.err.printf("Erreur non fatale (ligne %d, col %d) : %s\n",
e.getLineNumber(), e.getColumnNumber(), e.getMessage());
}
@Override
public void fatalError(SAXParseException e) {
System.err.printf("Erreur fatale : %s\n", e.getMessage());
}
@Override
public void warning(SAXParseException e) {
System.err.printf("warning : %s\n", e.getMessage());
}
10
2 L’API DOM (Document Object Model)
plu
gin
DO
M
plu
gin
DO
M
plu
gin
DO
M
Xerces
Crimson
xp
Application
DOM
des arbres XML
en mémoire
Représentation
• Representation objet en memoire d’un document XML ou HTML (4.0).
• Norme proposee par le consortium W3C ( http://www.w3.org/DOM/ ) pour resoudre les problemes liees
au DHTML (HTML + CSS + JavaScript).
• DOM se compose de deux parties :
. DOM noyau (Core DOM) pour XML,
. DOM HTML.
11
2.1 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
...
12
2.2 L’interface Node
Les methodes de l’interface org.w3c.dom.Node :
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()
Methodes de modification :
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)
...
13
2.3 Premier programme DOM
package exemples;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Comment;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class DomSample {
// methodes d’analyse et d’affichage
...
}
14
2.4 Premier programme DOM
Declaration de l’analyseur XML et creation du document :
public void parseXmlFile(String fileName) throws Exception {
// preparer une usine a fabriquer les analyseurs DOM
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
// construire une analyseur DOM
DocumentBuilder parser = factory.newDocumentBuilder();
// analyser et afficher le document XML
Document doc = parser.parse(new File(fileName));
printTree(doc);
}
15
2.5 Parcours d’un arbre DOM
Parcours de l’arbre XML :
public void printTree(Node n) {
if (n.getNodeType() == org.w3c.dom.Node.TEXT_NODE) {
System.out.print(n.getNodeValue());
} else if (n instanceof Comment) {
System.out.printf("<!-- %s -->", n.getNodeValue());
} else if (n instanceof Element) {
System.out.printf("<%s>", n.getNodeName());
printTrees(n.getChildNodes());
System.out.printf("</%s>", n.getNodeName());
} else if (n instanceof Document) {
printTrees(n.getChildNodes());
}
}
Afficher les noeuds fils :
public void printTrees(NodeList nodes) {
for (int i = 0; (i < nodes.getLength()); i++) {
printTree(nodes.item(i));
}
}
16
3 JAXP (Java API for XML Processing)
DOM
SAX
DOM
SAX
DOM
SAX
Application
Analyseurs
DOM/SAX
Processeur XSL
JAXP
Serializer
propose par JavaSoft ( http://java.sun.com/xml/jaxp/ ) et present depuis Java 2 version 1.4.
Unification des approches SAX et DOM
Proposition d’une API standard pour les transformations de documents XML (processeur XSL, FO et/ouXPATH).
17
3.1 Une usine a analyseurs
Le package javax.xml.parsers propose les classes
DocumentBuilderFactory producteur d’analyseurs DOM
SAXParserFactory producteur d’analyseurs SAX
DocumentBuilder Analyseur DOM
SAXParser Analyseur SAX
...
Quelques methodes de DocumentBuilderFactory :
static DocumentBuilderFactory newInstance()
boolean isValidating()
void setValidating(boolean validating)
DocumentBuilder newDocumentBuilder()
... ...
18
3.2 Une usine a analyseurs (suite)
Quelques methodes de SAXParserFactory :
static SAXParserFactory newInstance()
DocumentBuilder newDocumentBuilder()
SAXParser newSAXParser()
... ...
19
3.3 Les analyseurs JAXP
Les usines servent a produire des analyseurs ayant certaines caracteristiques.
Quelques methodes de DocumentBuilder :
Document parse(java.io.File f)
Document parse(org.xml.sax.InputSource is)
Document parse(java.io.InputStream is)
Document parse(java.lang.String uri)
void setErrorHandler(org.xml.sax.ErrorHandler eh)
... ...
Quelques methodes de SAXParser :
org.xml.sax.XMLReader getXMLReader()
void parse(java.io.File f, DefaultHandler dh)
void parse(InputSource is, DefaultHandler dh)
void parse(java.io.InputStream is, DefaultHandler dh)
void parse(java.lang.String uri, DefaultHandler dh)
20
3.4 Une usine pour transformer
Le package javax.xml.transform propose les classes
• TransformerFactory Fabrication des transformations
• Transformer Une transformation
• OutputKeys Le format de sortie d’une transformation
Quelques methodes de TransformerFactory :
static TransformerFactory newInstance()
... ...
Transformer newTransformer()
Transformer newTransformer(Source source)
... ...
Templates newTemplates(Source source)
Une Source peut etre :
• javax.xml.transform.dom.DOMSource un arbre DOM
• javax.xml.transform.sax.SAXSource une source d’evenements SAX
• javax.xml.transform.stream.StreamSource un flux a analyser
21
3.5 Les transformations
Quelques methodes de Transformer :
void setOutputProperty(String name, String value)
void setParameter(String name, java.lang.Object value)
... ...
void transform(Source xmlSource, Result outputTarget)
... ...
Un Result peut etre :
• javax.xml.transform.dom.DOMResult production d’un arbre DOM
• javax.xml.transform.sax.SAXResult production d’evenements SAX
• javax.xml.transform.stream.StreamResult production d’un flux XML
22
3.6 Un exemple de transformation
Lecture, copie et serialisation :
// Creer une usine a "transformer"
TransformerFactory factory = TransformerFactory.newInstance();
// Un premier "transformer" simple
Transformer analyseur = factory.newTransformer();
// Lire le document XML et en faire une copie
DOMResult xml = new DOMResult();
analyseur.transform(new StreamSource("test.xml"), xml);
DOMSource xmlSrc = new DOMSource(xml.getNode());
analyseur.transform(xmlSrc, new StreamResult("test2.xml") );
Utilisation d’une feuille de style XSLT :
// Un "transformer" processeur XSL
Transformer xslt = factory.newTransformer( new StreamSource("test.xsl") );
// appliquer la feuille XSLT
DOMResult out = new DOMResult();
xslt.transform(new DOMSource(xml.getNode()), out);
// Serialiser out dans "test.out" en iso-8859-1
analyseur.setOutputProperty(OutputKeys.INDENT, "yes");
analyseur.setOutputProperty(OutputKeys.ENCODING, "iso-8859-1");
analyseur.transform(
new DOMSource(out.getNode()),
new StreamResult("test.out")
);
23
4 Les alternatives a SAX/DOM/JAXP
24
4.1 La librairie JDOM
Objectifs : offrir une bibliotheque simple pour la representation et la manipulation de documents XML( http://www.jdom.org ).
import org.jdom.Element;
import org.jdom.Document;
import org.jdom.output.XMLOutputter;
public void createAndPrint() {
Element stock = new Element("stock")
.addContent(new Element("nom").setText("CD"))
.addContent(new Element("prix").setText("100"));
Document root = new Document(stock);
XMLOutputter outputter = new XMLOutputter(" ",true,"iso-8859-1");
try {
outputter.output(root, System.out);
} catch (java.io.IOException e) {
...
}
}
Des passerelles sont disponibles vers :
• la representation DOM,
• les evenements SAX,
• les analyseurs compatibles SAX/DOM,
• les processeurs XSL compatibles JAXP,
25
4.2 La librairie DOM4J
Objectifs : offrir une bibliotheque simple pour la representation et la manipulation via XPATH de documentsXML ( http://www.dom4j.org ).
Example Dom4J :
package exemples;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
public class Dom4jSample {
public static void main(String args[]) {
Document document = DocumentHelper.createDocument();
Element root = document.addElement("root");
root.addElement("author").addAttribute("name", "Toby")
.addAttribute("location", "Germany")
.addText("Tobias Rademacher");
root.addElement("author").addAttribute("name", "James")
.addAttribute("location", "UK").addText("James Strachan");
List<?> results = document.selectNodes("//author[@location = ’UK’]");
for (Iterator<?> iter = results.iterator(); iter.hasNext();) {
Element element = (Element) iter.next();
System.out.println(element.valueOf("concat(@name,’ : ’, .)"));
}
}
}
26
5 JAXB (Java API for XML Binding)
Objectif : mise en correspondance (binding) automatique entre une famille de documents XML et un schemade classes Java.
Continuite entre :
• une analyse UML,
• un diagramme de classes,
• un modele physique sous la forme d’un Schema XML,
• une implantation Java automatisee.
27
5.1 Compilation d’un DTD/schema
a partir de la DTD suivante (et/ou du schema) :
<!ELEMENT personne (nom,age,adresse)>
<!ELEMENT nom (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT adresse (rue,ville)>
<!ELEMENT rue (#PCDATA)>
<!ELEMENT ville (#PCDATA)>
nous obtenons
interface Personne { | interface Adresse {
String getNom(); | String getRue();
int getAge(); | String getVille();
Adresse getAdresse(); | }
} |
28
5.2 Lecture d’un fichier XML
En une seule operation le fichier XML peut etre
• analyse,• valide et• charge en memoire sous la forme d’instances des classes generees.
29
5.3 Generation de documents XML
• Ce mecanisme est la base de la persistance d’objet implantee dans les EJB ou les JDO (Java data Object).
• Il existe d’autres framework de mise en correspondance XML-Java comme
• castor (http://www.castor.org/),• breeze (http://www.breezefactor.com/),• XGen (http://www.commerceone.com/),
30