Upload
others
View
134
Download
0
Embed Size (px)
Citation preview
Developpement Java - XML
Developpement Java - XML
Jean-Michel [email protected]
http://www.info.univ-angers.fr/pub/richer
M1/M2 Informatique 2010-2011
1 / 48
Developpement Java - XML
Plan
Plan
1 Introduction
2 DOM
3 SAX
4 XPath
5 Application
6 Bibliographie
2 / 48
Developpement Java - XML
Plan
XML avec Java
Objectifs
• se familiariser avec le traitement des fichiers XML en Java
• utilisation avec DOM
• utilisation avec SAX
• utilisation de XPath
3 / 48
Developpement Java - XML
Introduction
Introduction
Introduction
4 / 48
Developpement Java - XML
Introduction
Rappel XML
XML (eXtensible Markup Language)
• standard W3C pour representation des donnees dans desdocuments balises
• definition structur ee de l’information (syntaxe +semantique)
• representation arborescente
• possibilite de definir une grammaire (Document TypeDefinition) : validation
5 / 48
Developpement Java - XML
Introduction
JAXP
JAXP (Java API for XML Processing)
capacite a lire et valider les documents XML, formee de troiscomposants :
• DOM (Document Object Model) : tree-based
• SAX (Simple API for XML) : event-based
• StAX (Streaming API for XML) (entre DOM et SAX)
http://jaxp.java.net
6 / 48
Developpement Java - XML
Introduction
StAX
StAX (Streaming API for XML)
entre DOM et SAX
• peu gourmand en memoire
• acces sequentiel aux donnees : mais contrairement a SAXon indique quel est le prochain element a traiter
• ecriture de fichiers XML
• StAX ne sera pas traite dans ce document
7 / 48
Developpement Java - XML
DOM
DOM
DOM
8 / 48
Developpement Java - XML
DOM
DOM
DOM (Document Object Model)
• API permettant d’acceder au contenu d’un document XMLsous la forme d’une structure arborescente
• chargement complet du document XML
• reserve a de petits fichiers et lecture lineaire
9 / 48
Developpement Java - XML
DOM
DOM et Java
DOM et Java• se referer au package org.w3c.dom
• le parser est issu de javax.xml.parsers.DocumentBuilder
• obtenu depuis javax.xml.parsers.DocumentBuilderFactory
10 / 48
Developpement Java - XML
DOM
Fichier exemple
Exemple de travail
1 <?xml version="1.0" encoding="UTF-8"?>2 <persons >
3 <person id="1">4 <first-name >Donald</first-name >
5 <last-name >Duck</last-name >
6 <date-of-birth >01-01-1970</date-of-birth >
7 <salary >1000.0</salary >
8 </person >
9 <person id="2">10 <first-name >Picsou</first-name >
11 <last-name >Duck</last-name >
12 <date-of-birth >02-01-1960</date-of-birth >
13 <salary >120000.0</salary >
14 </person >
15 <person id="3">16 <first-name >Mickey</first-name >
17 <last-name >Mouse</last-name >
18 <date-of-birth >01-01-1980</date-of-birth >
19 <salary >3000.20</salary >
20 </person >
21 </persons >
11 / 48
Developpement Java - XML
DOM
DOM creation du parser
Exemple
1 // ouverture d’un document XML sous DOM2 File fXmlFile = new File (fileName);3 DocumentBuilderFactory dbFactory = DocumentBuilderFactory .newInstance();4 // use DTD validation5 dbFactory.setValidating(true);67 DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();8 // report Errors if DTD validation is On9 // note: ErrorHandler must be defined
10 dBuilder.setErrorHandler(new ErrorHandler ());1112 Document doc = dBuilder.parse(fXmlFile);13 doc.getDocumentElement().normalize();
12 / 48
Developpement Java - XML
DOM
DOM lecture <tag>value</tag>
lecture <tag>value</tag>
1 NodeList nList;2 // Obtain all nodes for last name3 nList = doc.getElementsByTagName("last-name");45 // treat each node6 for (int i = 0; i < nList.getLength(); i++) {7 Node nNode = nList.item(i);8 if (nNode.getNodeType() == Node.ELEMENT NODE) {9 nNode.getTextContent().trim());
10 }11 }1213
13 / 48
Developpement Java - XML
DOM
DOM lecture <tag attr="value" />
lecture <tag attr="value" />
1 NodeList nList;2 // get all nodes person3 nList = doc.getElementsByTagName("person");4 // treat each node5 for (int i = 0; i < nList.getLength(); i++) {6 Node nNode = nList.item(i);7 if (nNode.getNodeType() == Node.ELEMENT NODE) {8 Element eElement = (Element ) nNode;9 // retrieve attribute id
10 String id=eElement.getAttribute("id").trim();11 // note : attribute nationality is not defined in persons.xml12 // so getAttribute will return an empty String13 String nationality=eElement.getAttribute("nationality").trim();14 if (nationality.isEmpty()) {15 nationality="french";16 }17 }18 }
attribut inexistant : chaıne vide !
14 / 48
Developpement Java - XML
SAX
SAX
SAX
15 / 48
Developpement Java - XML
SAX
SAX
SAX (Simple API for XML)
• API permettant d’acceder au contenu d’un document XMLde maniere evenementielle (≃ yacc)
• chargement partiel du document XML
• reserve a de gros fichiers et lecture non lineaire
16 / 48
Developpement Java - XML
SAX
SAX Handler
SAX Handler• definir une classe SAXReader qui herite de
org.xml.sax.helpers.DefaultHandler
• implanter les methodes de l’interface ContentHandler
17 / 48
Developpement Java - XML
SAX
methodes de DefaultHandler
methodes de DefaultHandler
ce sont celles de ContentHandler , pour les principales :
• startDocument
• startElement
• characters
• endElement
• endDocument
voir egalement les autres methodes pour les documents XMLplus complexes
18 / 48
Developpement Java - XML
SAX
methode characters
methode characters
elle permet de lire une chaıne de caracteres a l’interieur d’unebalise :
<tag>value</tag>
ici, on recuperera : value
19 / 48
Developpement Java - XML
SAX
methode startElement
methode startElement
elle permet de traiter les attributs :
<tag attr="vattr">...</tag>
en verifiant quelle est la valeur de la balise tag
20 / 48
Developpement Java - XML
SAX
methode endElement
methode endElement
elle permet de traiter :
<tag>value</tag>
en verifiant quelle est la valeur de la balise tag
21 / 48
Developpement Java - XML
SAX
methodes start/endElement
lecture <tag attr="vattr">value</tag>
il faut combiner les deux methodes
• startElement : pour lire les attributs et creer unestructure de donnees
• puis endElement pour lire value et l’affecter a lastructure de donnees
22 / 48
Developpement Java - XML
SAX
SAX creation parser
Exemple
1 import javax.xml.parsers.*;2 import org.xml.sax.*;3 import org.xml.sax.helpers.*;45 public class SAXReader extends DefaultHandler {67 protected String text;89 public SAXReader() throws Exception {
10 super ();11 }1213 public void read(String fileName) {14 try {15 XMLReader parser = XMLReaderFactory .createXMLReader();16 parser.setContentHandler(this );17 parser.setFeature("http://xml.org/sax/features/validation", true);18 parser.parse(fileName);19 } catch (Exception e) {20 System .err.println(e.getMessage());21 }22 }2324 public void characters(char[] ch, int start, int length)25 throws SAXException {26 text = new String (ch, start, length);27 }28 23 / 48
Developpement Java - XML
SAX
SAX lecture
lecture <tag>value</tag>
1 // read <tag>value</tag>2 public void endElement(String uri, String localName, String qName)3 throws SAXException {45 if (localName.equals("tag")) {67 String value = text.trim();89 }
10 }11
24 / 48
Developpement Java - XML
SAX
SAX lecture
lecture <tag attr="value" />
1 // read <tag attr=”vattr” />2 public void startElement(String uri, String localName, String qName,3 Attributes atts) throws SAXException {45 if (localName.equals("tag")) {67 String vattr = atts.getValue("attr").trim();89 // note : be careful because atts.getValue will return null
10 // if attribute is not present11 if (vattr==null) {12 vattr="";13 }14 }1516 }
attribut inexistant : null !
25 / 48
Developpement Java - XML
XPath
XPath
XPath
26 / 48
Developpement Java - XML
XPath
XPath
XPath (XML Path Language)
• est a XML ce que SQL est aux SGBD-R
• langage de selection de balises / attributs
27 / 48
Developpement Java - XML
XPath
Sans XPath
Sans XPath• avec DOM, utiliser :
• getElementsByTagName• getElementById
• avec SAX :• startElement• endElement
28 / 48
Developpement Java - XML
XPath
Librairies XPath
Librairies• Saxon 6.5.x (XPath 2.0)
• Xalan-J Apache (XPath 1.0)
• Jaxen http ://jaxen.org/
• depuis J2SE 5.0 (Tiger), API standard javax.xml.xpath(XPath 1.0)
29 / 48
Developpement Java - XML
XPath
Utilitaires sous Ubuntu
Sous Ubuntu
installer le package libxml-xpath-perl qui contient lebinaire xpath que l’on peut utiliser depuis le terminal :
• xpath -e "//person/first-name" persons.xml
30 / 48
Developpement Java - XML
XPath
Expressions XPath
Selection des noeuds
expression signification/ racine du document//balise tous les noeuds qui correspondent a la balise. noeud courant.. noeud parent@ selection d’attribut
31 / 48
Developpement Java - XML
XPath
Exemple Expression XPath
Exemple
• /person/first-name : tous les noeuds prenoms despersonnes
• //first-name : tous les noeuds prenoms
• //first-name/.. : tous les noeuds person
• //@id : tous les noeuds qui contiennent un attribut id
32 / 48
Developpement Java - XML
XPath
Predicats XPath
Selection specifique //person[...]
predicat signification1 la premiere personnelast() la derniere personnelast()-1 l’avant-derniere personneposition()<3 les 2 premieres personnes@id=2 la personne d’identifiant egal a 2salary > 3000 les personnes de salaire > 3000
33 / 48
Developpement Java - XML
XPath
Les fonctions XPath
Fonctions• nombres : +, -, *, div, mod, sum, ceiling, floor, round
• booleens : true, false, not
• chaınes : concat, substring, translate, normalize-space,string-length, contains, starts-with
• noeuds : count, position, last
34 / 48
Developpement Java - XML
XPath
Exemple fonction XPath
Exemple
• count(//person) : nombre de personnes
• sum(//person/salary) div count(//person) :moyenne des salaires
• //person[ not(number(salary) >(preceding-sibling::person/salary |following-sibling::person/salary)) ] :personne de salaire minimum
35 / 48
Developpement Java - XML
XPath
Selection de plusieurs chemins
Selection de chemins
On utilise | pour separer les chemins :
//person[salary > 3000] | //first-name
: donnera 3 noeuds first-name et deux noeuds person
36 / 48
Developpement Java - XML
XPath
XPath et DOM
Avec DOM
1 // doc is a DOM Document2 XPathFactory pathFactory=XPathFactory .newInstance();3 XPath xpath = pathFactory.newXPath();4 XPathExpression expr = xpath.compile("//person");56 // DOM specific7 NodeList nList = (NodeList )expr.evaluate(doc,XPathConstants .NODESET);89 for (int i = 0; i < nList.getLength(); i++) {
10 Node nNode = nList.item(i);11 if (nNode.getNodeType() == Node.ELEMENT NODE) {12 // your code here13 }14 }
37 / 48
Developpement Java - XML
XPath
XPath et SAX
Avec SAX
1 // fileName is a String2 File file=new File (fileName);3 InputSource source = new InputSource (new FileInputStream (file));4 XPathFactory fabrique = XPathFactory .newInstance();5 XPath xpath = fabrique.newXPath();6 XPathExpression expr = xpath.compile("//person");78 // SAX specific9 NodeList nList = (NodeList )expr.evaluate(source, XPathConstants .NODESET);
1011 for (int i = 0; i < nList.getLength(); i++) {12 Node nNode = nList.item(i);13 if (nNode.getNodeType() == Node.ELEMENT NODE) {14 // your code here15 }16 }
38 / 48
Developpement Java - XML
XPath
XPathExpression.evaluate
XPathExpression.evaluate(source, returnType)
evalue l’expression XPath en fonction du contexte
• source : InputSource• returnType : QName, un parmi :
• NODE, NODESET• NUMBER, BOOLEAN, STRING
39 / 48
Developpement Java - XML
Application
Application
Application
40 / 48
Developpement Java - XML
Application
Projet
projet
creer un projet Java standard sous Eclipse et mettre en place lalecture d’un graphe oriente pondere au format XML avec :
• DOM
• SAX
mettre en place des tests param etriques pour verifierl’integrite des donnees
41 / 48
Developpement Java - XML
Application
Projet
Classes de base : package model
creer les classes suivantes pour representer un graphe :
• Vertex (String name)
• Edge (Vertex initial, Vertex final, int cost)
• Graph (ArrayList<Vertex> vertices, ArrayList<Edge>edges)
42 / 48
Developpement Java - XML
Application
Format de fichier
Exemple de fichier graph.xml
1 <?xml version="1.0" encoding="UTF-8"?>2 <!DOCTYPE graph SYSTEM "graph.dtd">3 <graph >
4 <vertices >
5 <vertex >V1</vertex >
6 <vertex >V2</vertex >
7 <vertex >V3</vertex >
8 </vertices >
9 <edges>10 <edge initial="V1" final=" V2 " cost="4"/>11 <edge initial="V1" final=" V3 " />12 </edges>13 </graph >
43 / 48
Developpement Java - XML
Application
Format de fichier
DTD pour un graphe
1 <?xml version="1.0" encoding="UTF-8"?>2 <!ELEMENT graph (vertices, edges) >
3 <!ELEMENT vertices (vertex+) >
4 <!ELEMENT vertex (#PCDATA) >
5 <!ELEMENT edges (edge*) >
6 <!ELEMENT edge EMPTY >
7 <!ATTLIST edge cost CDATA #IMPLIED>8 <!ATTLIST edge initial CDATA #REQUIRED>9 <!ATTLIST edge final CDATA #REQUIRED>
10
44 / 48
Developpement Java - XML
Application
Projet
Classes du package io
creer les classes suivantes pour lire un graphe :
• DOMGraphReader
• SAXGraphReader
ces classes implantent la methode :Graph read(String fileName)
qui retourne un graphe ou null en cas d’erreur
45 / 48
Developpement Java - XML
Application
Projet
Classe du package tests
creer la classe GraphReaderTest pour tester les classes dupackage io :
• testDOMReader()
• testSAXReader()
utiliser les tests parametriques pour tester plusieurs graphes
46 / 48
Developpement Java - XML
Bibliographie
Bibliographie
Bibliographie
47 / 48
Developpement Java - XML
Bibliographie
Bibliographie, sitographie
• Processing XML with Java(TM) : A Guide to SAX, DOM,JDOM, JAXP, and TrAX, Elliotte Rusty Harold,Addison-Wesley , 2002
• Murach’s Java SE 6, Joel Murach, Andrea Steelman,Murach , 2007
• XPath 2.0 Programmer’s Reference, Michael Kay, Wrox ,2004
• www.developpez.com
48 / 48