Java & XML - Aix-Marseille...

Post on 22-May-2020

3 views 0 download

transcript

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("&amp;");

break;

case ’<’:

System.out.print("&lt;");

break;

case ’>’:

System.out.print("&gt;");

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