Sie sind auf Seite 1von 44

3.

API Java et XML


Ouvrages recommands : Java et XML 2nd dition B. McLaughlin - Edition O' eill! "Bi#lioth$%ue &ML'( XML in theor! and )ractice *. Bates Edition +ile!

O.Cur [42 ]

Pourquoi Java et XML

Java : code )orta#le ",rite oncerun an!,here( XML : donnes )orta#les On )eut aussi utiliser d'autres langages :

'isual Basic : )arser de .nternet E/)lorer 0- s)ci1i%ue 2 une )late1orme


O.Cur [43 ]

Autres langages

*33 : )lusieurs )arsers "Xerc$s- .E0etc.(- com)le/e 4erl : li#rairies XML im)ortantes 4!thon : li#rairies XML im)ortantese/)loitation marginale. Lis) et 5cheme : li#rairies XML intressantes- o)timisation im)ortante ")arsing 5cheme 3 ra)ide %ue *33(

O.Cur [44 ]

Java et XML

Java est )o)ulaire Java et XML voluent dans des environnements similaires : a))lications rseau/intero)ra#les et s!st$mes htrog$nes "ind)endance de la )late-1orme(.

O.Cur [45 ]

Traiter du XML

4arser : 6a com)uter )rogram that divides code u) into 1unctional com)onents6 (hyperdictionary.com). Ecrire un )arser est une t7che com)le/e "im)lmentation- o)timisation- etc.(. On )ro1ite donc des )arsers dis)oni#les "li#res8 )ro)ritaires( 9: com)ati#ilit ascendantevolution ; <cessit de changer de )arser sur la dure de vie d'une a))lication.
O.Cur [46 ]

JAXP (Java API for XML Parsing)

&ne initiative de 5un Micros!stems )our crer une =4. ind)endante de la structure des donnes et des traitements. J=X4 est une =4. standard )our les traitements et trans1ormations associs 2 XML.

O.Cur [47 ]

JAXP (2)

J=X4 su))orte >OM et 5=X "les deu/ )rinci)ales =4.(. J=X4 )ro)ose des mthodes %ui )euvent ?tre e/)loites avec des =4. com)ati#les. &n )arser est charg lors de l'e/cution )ar une classe factory "c1. >esign )attern- dcrit comment les classes )euvent ?tre instancies et charges au moment de l'e/cution(. E/em)le :

javax.xml.parsers.SAXParserFactory charge un )arser 5=X. javax.xml.parsers.DocumentBuilderFactory charge un constructeur >OM


O.Cur [48 ]

Xerces

Xerces "=)ache 1oundation( )ro)ose un )arser 5=X et >OM. *om)ati#ilit avec les recommandations du +@* : XML A.B- <ames)aces- XML 5chema A.B>OM level 2 avec 5=X 2- J=X4 A.A Xerces 2 su))orte XML 5chema

O.Cur [49 ]

API Java pour XML

=4. de #as niveau "low-level API( : elle )ermet un traitement direct des documents XML

La sortie est du XML 4uissantes et e11icaces <cssitent une #onne connaissance de XML Les solutions : 5=X "5im)le =4. 1or XML(- >OM ">ocument O#Cect Model(- J>OM- J=X4.

O.Cur [50 ]

API Java pour XML(2)

=4. de haut niveau "high-level API( : elle e/)loite une =4. de #as niveau.

>ivers 1ormats en sortie >velo))ement ra)ide et 1acile mais traitement lourd Dem)s d'a))rentissage de l'=4. im)ortant 5olution : XML >ata Binding "trans1orme un document XML et o#Cets Java(.

O.Cur [51 ]

Parser XML

&n )arser est un )rogramme %ui va lire un document XML et anal!ser sa structure.

On )eut aussi dire %u'un )arser trans1orme un document XML en une structure de donne %ui )eut ?tre mani)ule. =ssure %ue le document est #ien 1orm. 5i un schma e/iste- assure %ue le document est valide.

Euel%ues 1onctionnalits :

O.Cur [52 ]

Parser XML (2)

=rguments )our choisir un )arser : e11icacitcon1ormit au/ normes "+@*(. 5olutions : Xerc$s "=)ache(- X4- XMLFJ ".BM(*rimson "5un(- M5XML "Microso1t(- Oracle XML 4arser.

O.Cur [53 ]

Parser XML (3)

En gnral- on utilise un )arser de la mani$re suivante :


*ration d'un o#Cet )arser On )ointe cet o#Cet sur un document XML On ralise des traitements ")ar e/em)le crer une )age ,e# ou #ien gnrer un #on de commande en 4>G(.

O.Cur [54 ]

AX ( i!ple API for XML)

5=X est une =4. XML vnementielle "event-driven(.

Elle ne construit )as une re)rsentation du document XML en mmoire. Le )rogramme reHoit des noti1ications lors%ue le )arser reconnaIt des )arties s)ci1i%ues d'un document XML. Les noti1ications "events( sont gres )ar des gestionnaires de noti1ications "event handlers(. @ t!)es de event handlers :

>D>Jandler : acc$s au contenu de la >D> ErrorJandler : acc$s au/ erreurs d'anal!se *ontentJandler : acc$s au contenu du document.

O.Cur [55 ]

"v#ne!ents avec
Le document :
<?xml version="1.0"?> <personne> <prenom>Pierre</prenom> <nom>Durand</nom> </personne>

AX

Les vnements :
start document start element: personne start element: prenom characters: Pierre end element: prenom start element: nom characters: Durand end element: nom end element: personne end document

O.Cur [56 ]

Le paquetage org.$!l.sa$

org./ml.sa/

*ontient des inter1aces et classes )ermettant la mani)ulation de documents.


Interfaces

AttributeList, Attributes, ContentHandler, DocumentHandler, DTDHandler, EntityResolver, ErrorHandler, Locator, Parser, XMLFilter, XMLReader

Classes

HandlerBase, InputSource

O.Cur [57 ]

Interface %ontent&andler

*ette inter1ace )ermet de noti1ier :


Le d#ut et la 1in d'un document. Le d#ut et la 1in d'un lment. Les donnes Les es)aces de noms Les 6)rocessing instructions6 "4.( >'ignorer les 'es)aces'.

O.Cur [58 ]

Interface %ontent&andler (2)

Mthodes

characters : g$re les noeuds te/tuels start>ocument et end>ocument : g$re le d#ut et la 1in d'un document. startElement et endElement : g$re le d#ut et la 1in d'un lment.

*G. Cava>oc

O.Cur [59 ]

Interface XML'eader

Le )oint d'entre d'une a))lication 5=X est l'inter1ace XML eader %ui contient les mthodes %ui vont )ermettre :

>e contrKler la mani$re dont va o)rer le )arser. >'activer8 dsactiver certaines 1onctionnalits de 5=X "gestion des es)aces de noms(. >'instancier des o#Cets )ouvant recevoir des noti1ications. >'initialiser le 1lu/ d'entre du )arser.
O.Cur [60 ]

(n e$e!ple ())
import org.xml.sax.*; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.SAXException; import java.io.IOException; class MonHandler extends DefaultHandler { public void startDocument() throws SAXException { System.out.println("Debut du document"); } public void endDocument() throws SAXException { System.out.println("Fin du document"); } public void startElement(String namespaceURI, String localName, String qName, Attributes atts) { System.out.println("Debut de balise"); System.out.println(" Nom local :" +localName); System.out.println("Length ="+atts.getLength()); for(int cpt=0;cpt<atts.getLength();cpt++) System.out.println(atts.getLocalName(cpt)+" = "+ atts.getValue(cpt)); }

O.Cur [61 ]

(n e$e!ple (2)
public void endElement(String namespaceURI, String localName, String qName) { System.out.println("Fin de balise :"); } } public class Ex2SAX { private String docName; public Ex2SAX(String docName) { this.docName = docName; MonHandler monHandler = new MonHandler(); try { XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser "); try { parser.setContentHandler(monHandler); parser.setFeature("http://xml.org/sax/features/validation", true); parser.parse(docName); } catch (IOException ioexc) { System.out.println("PB acces a ele1.xml");} } catch (SAXException saxexc) { System.out.println("Pb SAX" + saxexc.getMessage()); } }

O.Cur [62 ]

(n e$e!ple (3)
public static void main(String[] args) { System.out.println("Exemple - SAX"); if(args.length==1) { Ex2SAX exSax = new Ex2SAX(args[0 ]); } else System.out.println("1 argument requis"); } }

O.Cur [63 ]

*ilan

AX

=vantages :

utilisation mmoire et )er1ormance de traitement sont ind)endantes de la taille du document. Draitement )ossi#le avec une lecture com)l$te du document. Le dvelo))eur est res)onsa#le de la structure de donne %ui stocLe les in1ormations. 4as ada)te 2 un acc$s alatoire au/ donnes du document.

.nconvnients :

O.Cur [64 ]

+,M (+ocu!ent ,-.ect Model)

&ne recommendation du +@*. <'est )as conHu s)ci1i%uement )our le langage Java. e)rsente le contenu et le mod$le d'un document %uel%ue soit le langage de )rogrammation. =rchitecture en couches

Le niveau A dtaille les 1onctionnalits et la navigation dans un document ")as ncessairement du XML(. Le niveau 2 aCoute des 1onctionnalits )our XML- JDML et *55. Le niveau @ "Load and 5ave( est une recommandation "avril 2BBF(
O.Cur [65 ]

+,M (suite)

En anal!sant un document XML avec >OM- on o#tient un ar#re %ui re)rsente le contenu du document "te/te- lments et attri#uts(. >OM ne 1ournit )as d'in1ormation sur le codage du document "attention au/ es)aces(.

O.Cur [66 ]

"$e!ple d/ar-re +,M


<catalog> <book id="101"> <title>XML in a Nutshell</title> <author>Elliotte Rusty Harold, W. Scott Means</author> <price>39.95</price> </book> <book id="121"> <title>Who Moved My Cheese</title> <author>Spencer, M.D. Johnson, Kenneth H. Blanchard</author> <price>19.95</price> </book> </catalog>

O.Cur [67 ]

"$e!ple +,M
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class Ex1Dom { private String uri; private Document doc; private int docNd, eleNd, attNd, txtNd; private static long debut, fin; public Ex1Dom(String uri) { this.uri = uri; doc = null; docNd = 0; eleNd = 0; attNd = 0; txtNd = 0; try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); debut = System.currentTimeMillis(); doc = db.parse(uri); fin = System.currentTimeMillis(); if (doc != null) { count(doc); printStats(); } }

O.Cur [68 ]

"$e!ple +,M (2)


catch (Exception e) { System.err.println("Erreur : " + e.getMessage());} } public void count(Node node) { int type = node.getNodeType(); switch (type) { case Node.DOCUMENT_NODE: { docNd++; processChild(node); break; } case Node.ELEMENT_NODE: { eleNd++; System.out.println(node.getNodeName()); NamedNodeMap atts = node.getAttributes(); if(atts.getLength()>0) attNd += atts.getLength(); processChild(node); break; }

O.Cur [69 ]

"$e!ple +,M (3)


case Node.TEXT_NODE: { txtNd++; break;} } // ferme le switch } // ferme la mthode count public void processChild(Node node) { NodeList sousNd; sousNd = node.getChildNodes(); for(int cpt=0;cpt<sousNd.getLength();cpt++) count(sousNd.item(cpt)); } public void printStats() { System.out.println("Document node = "+docNd); System.out.println("Element nodes = "+eleNd); System.out.println("Attribute nodes = "+attNd); System.out.println("Text nodes = "+txtNd); System.out.println("Duree parsing = "+Long.toString(fin-debut) +" ms"); }

O.Cur [70 ]

"$e!ple +,M (0)


public static void main(String[] args) { Ex1Dom ex1Dom = new Ex1Dom(args[0]); } }// ferme la classe Ex1Dom

O.Cur [71 ]

*ilan de +,M

5tructure ar#re )ro)ose une #onne solution )our la navigation dans le document. *onstruction de l'ar#re en un seul )assage ")as d'anal!se )artiel du document(. *onstruction en mmoire 9: attention au/ documents volumineu/. =vantages :

=cc$s alatoire Ecriture dans le document.


O.Cur [72 ]

J+,M

&ne r)onse 2 ceu/ %ui trouvent 5=X et >OM com)li%us. *omme >OM- J>OM )ro)ose un ar#re du contenu du document. J>OM inclut des ada)tateurs %ui utilisent des )arsers 5=X et >OM en t7che de 1ond. J>OM est s)ci1i%ue 2 Java alors %ue >OM est neutre en terme d'e/)loitation d'un langage de )rogrammation. J>OM e/)loite de nom#reuses caractristi%ues de Java "collections- surcharge de mthodes- etc..(. J>OM est une =4. o)en-source : ,,,.Cdom.org
O.Cur [73 ]

J+,M (2)

J>OM n'est )as un )arser- c'est une re)rsentation en Java d'un document XML. L'e/)loitation de J>OM re)ose donc sur l'utilisation d'un )arser )our lire les documents XML. J>OM acce)te galement les vnements 5=X et les ar#res de >OM. 4our 1aciliter ce mcanisme- J>OM )ro)ose le )acLage org.Cdom.in)ut. *e )acLage contient des classes builder. <ous utiliserons le )lus souvent SAXBuilder et DOMbuilder.

O.Cur [74 ]

*uilders
SAXBuilder builder = new SAXBuilder( ); Document doc = builder.build(new FileInputStream("contents.xml"));

Ou )our >OM:

DOMBuilder builder = new DOMBuilder( ); Document doc = builder.build(myDomDocumentObject);

=ttention- >OMBuilder e/)loite 5=X )our construire l'ar#re >OM )uis une traduction intervient )our o#tenir l'ar#re J>OM. *'est moins ra)ide %ue d'e/)loiter 5=X )our construire l'ar#re J>OM.J>OMBuilder est ada)t lors%ue l'entre est dC2 un ar#re >OM )as )our un 1lu/ te/te XML.
O.Cur [75 ]

1#rer la sortie

Les classe XMLOut)utter- mais aussi >OMOut)utter et 5=XOut)utter sont dis)oni#les. E/em)le:

XMLOutputter outputter = new XMLOutputter(); outputter.output(jdomDocObject,"new FileOutputStream("resultat.xml"));

O.Cur [76 ]

Mod2le de J+,M
La classe >ocument est la re)rsentation d'un document XML et la su)er classe des classes de J>OM Element et =ttri#ute re)rsentent res)ectivement un lment et un attri#ut XML.

O.Cur [77 ]

"le!ent

=vec >OM- le contenu d'une #alise est un noeud. =vec J>OM- la classe Element )ro)ose une mthode getDe/t"(.

4lus intuiti1 )our un dvelo))eur Java.

O.Cur [78 ]

%r#ation d/un docu!ent


Element elementRacine = new Element("racine"); Document document = new Document(elementRacine);

O.Cur [79 ]

"$e!ple J+,M
import java.io.File; import org.jdom.Document; import org.jdom.input.SAXBuilder; import org.jdom.output.XMLOutputter; public class JDomOne { public static void main(String[] argv) { if (argv.length == 0 || (argv.length == 1 && argv[0].equals("help"))) { System.out.println("1 argument necessaire (document xml)."); System.exit(1); } try { SAXBuilder sb = new SAXBuilder(); Document doc = sb.build(new File(argv[0])); XMLOutputter xo = new XMLOutputter(); xo.output(doc, System.out); } catch (Exception e) { e.printStackTrace(); } } }
O.Cur [80 ]

+ata *inding

Le data #inding est le )rocessus de re)rsenter des #its de donnes "issues d'un 1ichier te/te- d'une #ase de donnesd'un document XML( sous une 1orme de donnes dans un langage de )rogrammation "sur les%uelles il sera )ossi#le de raliser des o)rations(. >u XML data #inding en Java )ermet de trans1ormer un document XML en des o#Cets Java.
O.Cur [81 ]

Le$ique du data -inding

Marshalling : convertir des donnes en mmoire vers un mdia de stocLage "B>- 1ichier te/te- XML(. E/ : convertir des o#Cets Java en un document XML. &nmarshalling : convertir les donnes d'une structure de stocLage vers des donnes en mmoire. E/ : convertir d'un document XML vers des o#Cets Java. ound-tri))ing : terme e/)rimant un c!cle com)let de marshalling-unmarshalling. &ne =4. e11icace doit )ermettre une %uivalence smanti%ue lors d'un c!cle com)let "round-tri))ing(.

O.Cur [82 ]

Arc3itecture JAX*

O.Cur [83 ]

1#n#ration de classes

Elle se #ase sur le schma du document XML. 5uivant l'=4. : >D>- XML schema ou ela/<M. Les solutions :

*astor "E/ola#( - Neus "Enh!dra( - J=XB "5un(- Ja/Me "=)ache(.

O.Cur [84 ]

Pro-l2!es

4ro#l$me de t!)age des donnes dans le langage de )rogrammation.

O.Cur [85 ]

Das könnte Ihnen auch gefallen