Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parAline Cuvelier Modifié depuis plus de 9 années
1
MJ. Blin et M. CsernelPoleInfo31 XML et ses environnements Documents XML bien formés Prologue Arbre d'éléments Attributs Commentaires Entités internes Entités externes Définition d'une DTD Eléments composés de fils Libre choix de l'ordre d'apparition des éléments fils Eléments constitués de données Modèle mixte Eléments à contenu libre Eléments vide Définition d'un schéma Définition d'éléments Définition de types Définition d'attributs Annotations et documentation Création d'une bases de données relationnelles à partir d'une DTD ou d'un schéma et de documents XML bien formés et valides Dérivation du schéma de la base à partir de la DTD ou du schéma XML Remplissage des tables à partir des documents Solutions Java pour la lecture et la génération de fichiers XML Lecture et parsing de fichiers XML Génération de fichiers XML à partir d’une structure de données quelconque Traitement d'un fichier XML Les requêtes XPath Parcours d’un arbre DOM à l'aide de l'API XPath Transformation d’un fichier XML en un fichier HTML ou un fichier texte ou un autre fichier XML Solution Java Le langage XSLT
2
MJ. Blin et M. CsernelPoleInfo32 Documents XML bien formés Documents composés de : 1°) un prologue 2°) un arbre d'éléments 3°) des commentaires Prologue. Il est facultatif <?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?> <!DOCTYPE nomDocument SYSTEM "chemin d'une DTD" [déclarations]> nomDocument correspond à la racine de l'arbre d'éléments La clause SYSTEM et déclarations sont facultatifs
3
MJ. Blin et M. CsernelPoleInfo33 Arbre d'éléments Mercedes Classe A 1111 AA 75 MJ. Blin -50 V. Blin Renault Megane 2222 AA 75 M. Csernel -50 Une seule racine
4
MJ. Blin et M. CsernelPoleInfo34 Attributs INRIA Domaine de Voluceau Le Chesnay Cedex Université Paris-Dauphine Pl. du Mal. De Lattre de Tassigny Paris MJ. Blin P628 01 44 05 47 25 M. Csernel 005 01 39 63 55 10
5
MJ. Blin et M. CsernelPoleInfo35 Entités internes <!DOCTYPE test [ ]> &lab; Commentaires
6
MJ. Blin et M. CsernelPoleInfo36 Entités externes EXEMPLE : <!DOCTYPE livre [ ]> Fantastique option de Miage &nomAuteur; &chapitre1;&chapitre2;
7
MJ. Blin et M. CsernelPoleInfo37 Un document bien formé : est syntaxiquement correct possède une racine unique Exemple de document mal formé <?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?> MJ. Blin P628 01 44 05 47 25 M. Csernel 005 01 39 63 55 10
8
MJ. Blin et M. CsernelPoleInfo38 Définition d'une DTD Exemple : contenu de la DTD Le contenu peut-être des définitions : d'éléments d'attributs des commentaires
9
MJ. Blin et M. CsernelPoleInfo39 Définition d'éléments 1°) Un élément est composé d'éléments fils avec ^ := rien | ? | * | + Si ^ = ?, l'élément peut apparaître 0 ou 1 fois Si ^ = *, l'élément peut apparaître 0, 1 ou n fois Si ^ = +, l'élément peut apparaître 1 ou n fois Exemple: soit le fichier DTD "livre.dtd" <!ELEMENT chapitre (titre, intro, (titre-section, corps-section)+)> soit le document bien formé et valide cours de l'option Miage3 …… Documents bien formés … Définition d'une DTD …
10
MJ. Blin et M. CsernelPoleInfo310 Libre choix de l'ordre d'apparition des éléments fils Fichier DTD "assurance.dtd" : Document bien formé et valide : …
11
MJ. Blin et M. CsernelPoleInfo311 2°) Un élément est constitué de données 3°) Modèle mixte Soit l'extrait de DTD suivant : Exemple de document bien formé et valide : On remarquera que x = (y+z) est toujours positif 4°) Définition d'élément à contenu libre 4°) Elément vide <!ELEMENT titre (#PCDATA | EMPTY)
12
MJ. Blin et M. CsernelPoleInfo312 Définition d'attributs Exemple : Valeur par défaut toute valeur ou : #REQUIREDla valeur de l'attribut est obligatoire #IMPLIEDla valeur de l'attribut est facultative #FIXED "valeur"la valeur de l'attribut est fixée dans la DTD et est non modifiable
13
MJ. Blin et M. CsernelPoleInfo313 Type d'attribut : CDATAdonnées caractères enumerated listeune valeur dans la liste ENTITYune entité de la DTD ENTITIESplusieurs entités de la DTD séparées par des espaces IDun identificateur unique d'élément IDREFla valeur d'un attribut de type ID unique IDREFSplusieurs IDREF séparés par des espaces NMTOKENun token Xml NMTOKENSplusieurs tokens xml séparés dans des espaces NOTATIONune notation de la DTD
14
MJ. Blin et M. CsernelPoleInfo314 Exemple : fichier DTD "secteur.dtd" Document bien formé et valide : Jack Rusell Terri White Autre exemple : DTD
15
MJ. Blin et M. CsernelPoleInfo315 Alexis Sinclair 91 01 MAT295S 98 02 AER201S 55 01 POL102Y 99 01 ECE253F 97 21 CSC205S
16
MJ. Blin et M. CsernelPoleInfo316 <!ATTLIST Book Genre (Fiction | Non-Fiction) "Fiction" In_Stock (Yes | No) "Yes"> The Round Door Tom Evans 1996 0-9546-0274-3 $23.00 An Intriguing Tale Of A Round Door In A Wall Creating Real Xml Applications Bill Eaton 1998 7-4562-0167-8 $35.00 A Look At How To Build Real Xml Applications Over The Hills Of Yukon Bert Colewell 1993 5-6524-3054-1 $22.00 A Warm Story About A Man And A Moose In Yukon
17
MJ. Blin et M. CsernelPoleInfo317 Les schémas, concepts de base Exemple : contenu du schéma Le contenu peut-être des définitions : d'éléments de types d'éléments d'attributs des annotations et documentation
18
MJ. Blin et M. CsernelPoleInfo318 Définition d'éléments Exemple: éléments de type simple Exemple: éléments de type complexe
19
MJ. Blin et M. CsernelPoleInfo319 Par défaut, les éléments apparaissent une fois. Sinon : Exemple :
20
MJ. Blin et M. CsernelPoleInfo320 Définition d'attributs Exemple :
21
MJ. Blin et M. CsernelPoleInfo321 Table 1. Occurrence Constraints for Elements and Attributes (http://www.w3.org/TR/xmlschema-0/) ElementsAttributesNotes (minOccurs, MaxOccurs)use, values fixed, default (1, 1) -, - required, - element/attribute must appear once, it may have any value (1, 1) 37, - required, 37 element/attribute must appear once, its value must be 37 (2, unbounded) 37, - n/a element must appear twice or more, its value must be 37; in general, minOccurs and maxOccurs' values may be positive integers, and maxOccurs' value may also be "unbounded" (0, 1) -, - optional, - element/attribute may appear once, it may have any value (0, 1) 37, - fixed, 37 element/attribute may appear once, if it does appear its value must be 37, if it does not appear its value is 37 (0, 1) -, 37 default, 37 element/attribute may appear once; if it does not appear its value is 37, otherwise its value is that given (0, 2) -, 37 n/a element may appear once, twice, or not at all; if it does not appear its value is 37, otherwise its value is that given; in general, minOccurs and maxOccurs' values may be positive integers, and maxOccurs' value may also be "unbounded" (0, 0) -, - prohibited, - element/attribute must not appear
22
MJ. Blin et M. CsernelPoleInfo322 Element de n'importe quel type : ou bien, puisque le type par défaut est anyType Annotations et documentation : définition de la structure des adresses Peuvent être placés en début de définition de schéma, de définition d'un élément ou d'un type complexe
23
MJ. Blin et M. CsernelPoleInfo323 Création d'une bases de données relationnelles à partir d'une DTD ou d'un schéma et de documents XML bien formés et valides Document MJ.Blin Place du Mal de Lattre de Tassigny Paris 75775 Base de données Génie logiciel Fichier DTD "personne.dtd"
24
MJ. Blin et M. CsernelPoleInfo324 définition de la structure des documents employe Ou bien : Fichier schéma "personne.xsd"
25
MJ. Blin et M. CsernelPoleInfo325 Schéma de la base : employe {idemploye: id, nom: string) adresse {idadresse:id, rue:string, ville:string, codePostal:string, idemploye: id} projet {idprojet:id, projet:string, idemploye:id} Contenu de la table employé idemploye nom 1 MJ. Blin Contenu de la table adresse idadresse rue villecodePostalidemploye 1Place du Mal Paris 75775 1 de Lattre de Tassigny Contenu de la table projet idprojetprojetidemploye 1Base de données 1 2Génie Logiciel 1
26
MJ. Blin et M. CsernelPoleInfo326 Solutions Java pour le traitement de fichiers XML Lecture et parsing de fichiers XML /* lecture d'un fichier xml, parsing, traitement des erreurs */ import java.io.* ; import java.util.*; import javax.xml.parsers.*; import org.xml.sax.*; import org.w3c.dom.*; import java.awt.*; import java.awt.event.*; public class EssaiDom7 { public static void main (String [] args) throws IOException, ParserConfigurationException { /* lecture du nom du fichier XML */ File fichier = LectureNomFichier.lecture(); DomEcho objetDomEcho = new DomEcho(); /* appel de la methode qui parse le fichier xml et qui crée un arbre DOM */ Document docIn = objetDomEcho.lectureEtParsingXML (fichier); /* traitement de l'arbre DOM du document xml */ TraiteDom objetTraiteDom = new TraiteDom(); objetTraiteDom.traitement(docIn); } // fin de la methode main } // fin de la classe EssaiDom7 Solution DOM
27
MJ. Blin et M. CsernelPoleInfo327 /* cette classe demande la frappe au clavier d'un nom de ficher et recherche si le fichier existe */ class LectureNomFichier { static File lecture () throws IOException { File fichier=null; FileReader fic=null; String f1=null; /* preparation de la saisie du nom du fichier xml au clavie */ BufferedReader clavier=new BufferedReader (new InputStreamReader(System.in)) ; System.out.print ("entrer le nom du fichier original : ") ; while (fic==null) { try { f1=clavier.readLine() ; } // fin du try catch (IOException e) {} try { /* recherche du fichier */ fichier=new File (f1) ; fic=new FileReader(fichier); } // fin du try /* cas ou l'utilisateur n'a pas saisi de nom de fichier */ catch (NullPointerException e) { System.out.println (" Vous devez taper un nom de fichier") ; } // fin du catch /* cas ou le fichier n'existe pas */ catch (FileNotFoundException e) { System.out.println ("Vous devez taper un nom de fichier existant") ; } // fin du catch } // fin du while return fichier; } // fin de la méthode lecture } // fin de la classe LectureNomFichier
28
MJ. Blin et M. CsernelPoleInfo328 class DomEcho { Document document; /* methode qui parse un fichier xml fourni en parametre */ Document lectureEtParsingXML (File f1) throws IOException, ParserConfigurationException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); /* validation du document avec la dtd dont le nom est declare en tete du document xml */ factory.setValidating(true); try { DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler( new org.xml.sax.ErrorHandler() { // traitement des erreurs fatales public void fatalError(SAXParseException err) throws SAXParseException { System.out.println("erreur fatale de parsing ligne no : " + err.getLineNumber() + " " + err.getMessage ()); throw err; } // fin de la methode fatalError // traitement des erreurs public void error (SAXParseException err) throws SAXParseException { System.out.println("erreur de parsing ligne no : " + err.getLineNumber() + " " + err.getMessage ()); throw err; } // fin de la methode error // traitement des warnings public void warning(SAXParseException err) { System.out.println("attention ligne no : " + err.getLineNumber() + " " + err.getMessage ()); } // fin de la methode warning } // fin de la classe interne ); document = builder.parse(f1); } // fin du try catch (SAXParseException spe) { System.exit (0); } // fin du catch catch (SAXException sxe) { } // fin du catch return document; } // fin de la methode lectureEtParsingXML } // fin de la classe DomEcho
29
MJ. Blin et M. CsernelPoleInfo329 class TraiteDom extends Frame { // pour l'indentation des messages dans la fenetre String indent=""; java.awt.List dataList = new java.awt.List(); void traitement (Document docIn) { Node n=null; Node nChild; Node nRacine; /* recuperation de l'element racine du document xml */ Element racine = docIn.getDocumentElement(); n = (Node) racine; nRacine=n; boolean fini=false; /* placement de la fenetre de resultats dans l'ecran */ int posX=200; // coordonnee x du coin superieure gauche int posY=100; // coordonnee y du coin superieur gauche this.setFont(new Font(null, Font.ROMAN_BASELINE,12)); int dimX=500; // largeur de la fenetre int dimY=500; // hauteur de la fenetre this.setBounds (posX, posY, dimX, dimY); this.setState(Frame.NORMAL); this.toFront(); /* initialisation du traitement des evenements fenetre */ /* creation d'une classe interne pour traiter la fermeture de la fenetre */ this.addWindowListener (new WindowAdapter (){ public void windowClosing (WindowEvent e) { System.exit (0); } }); boolean remontee=false;
30
MJ. Blin et M. CsernelPoleInfo330 /* Exploration de l'arbre Dom */ while (!fini) { /* test si le noeud en cours a des noeuds fils */ while (n.hasChildNodes()) { /* on est sur un noeud */ /* affichage de la valeur */ if (remontee != true) { dataList.add(indent+"Noeud "+n.getNodeName()); /* traitement des attributs de l'element */ NamedNodeMap nNM=n.getAttributes (); /* pour chaque attribut, recuperation de son nom et de sa valeur */ for (int i=0; i<=(nNM.getLength()-1); i++) { Attr attribute = (Attr) nNM.item(i); String s1=attribute.getName(); String s2=attribute.getValue(); /* impression du nom et de la valeur de l'attribut */ dataList.add(indent+" Attribute "+s1 +" = "+s2); } // fin du for } // fin du if /* mise a jour de l'indentation pour l'affichage du prochain message */ indent=indent+" "; n=n.getFirstChild (); remontee=false; }// fin du while 3 /* on est arrive a une feuille */ String s1=n.getNodeValue(); if (s1!= null) { s1=n.getNodeValue().trim(); if (s1.length()!=0) { int x = s1.indexOf("\n"); if (x==0) s1=null; if ((x!= -1) && (x!=0)) s1= s1.substring(0, x); dataList.add(indent+"Feuille "+n.getNodeName()+" "+s1); } // fin du 2eme if } // fin du 1er if else dataList.add(indent+"Feuille "+n.getNodeName());
31
MJ. Blin et M. CsernelPoleInfo331 /* remontee au noeud pere */ nChild=n; n=nChild.getParentNode(); n.removeChild (nChild); indent = indent.substring(0,(indent.length()-13)); remontee = true; } // fin du while 2 /* le noeud pere n'a plus de fils, remontee dans l'arbre sauf si on etait sur la racine */ if (n!=nRacine) { /* remontee au noeud pere */ nChild=n; n=nChild.getParentNode(); n.removeChild (nChild); indent = indent.substring(0,(indent.length()-13)); remontee=true; } // fin du if /* si on est remonte jusqu'a la racine et que l'on a epuise tous ses fils, fin */ else {fini=true;} } // fin du while 1 /* affichage des resultats */ this.add(dataList); this.setVisible(true); } // fin de la methode traitement } // fin de la classe TraiteDom
32
MJ. Blin et M. CsernelPoleInfo332 Solution SAXE import java.io.* ; import java.util.*; import javax.xml.parsers.*; import org.xml.sax.*; import org.w3c.dom.*; import java.awt.*; import java.awt.event.*; import org.xml.sax.helpers.DefaultHandler; public class EssaiSaxe3 { public static void main (String [] args) throws IOException, ParserConfigurationException { /* la classe LectureNomFichier est la meme que dans la solution DOM */ File fichier = LectureNomFichier.lecture(); DomEcho objetDomEcho = new DomEcho(); /* preparation de l'affichage des resultats */ AfficheResultats affiche=new AfficheResultats(); AfficheResultats fenetre=affiche.initialisation(); /* parsing du fichier xml */ objetDomEcho.lectureEtParsingXML (fichier, fenetre); affiche.affichageResultats(); } // fin de la methode main } // fin de la classe EssaiSaxe3
33
MJ. Blin et M. CsernelPoleInfo333 class DomEcho extends DefaultHandler{ AfficheResultats fen2=null; void lectureEtParsingXML (File f1, AfficheResultats fen1) { fen2=fen1; DefaultHandler handler = this; SAXParserFactory factory = SAXParserFactory.newInstance(); /* validation du document xml avec la dtd dont le nom est declare en tete du document xml */ factory.setValidating(true); try { // Parsing du document passe en parametre SAXParser saxParser = factory.newSAXParser(); saxParser.parse(f1, handler); } // fin du try catch (Throwable t) { t.printStackTrace(); } // fin du catch } // fin de la methode lectureEtParsingXML // methode appelee en debut de document XML public void startDocument() throws SAXException { fen2.debutDocument(); } // fin de la methode startDocument // methode appelee en fin de docuemnt XML public void endDocument() throws SAXException { fen2.finDocument(); } // fin de la methode endDocument // methode appelee a la rencontre d'une balise d'ouverture public void startElement(String namespaceURI,String sName,String qName, Attributes attrs) throws SAXException { fen2.addElement(qName); if (attrs != null) { for (int i = 0; i < attrs.getLength(); i++) { String aName = attrs.getLocalName(i); if ("".equals(aName)) aName = attrs.getQName(i); String aValue=attrs.getValue(i); fen2.addAttribute(aName, aValue); } // fin du for } // fin du if } // fin de la methode startElement
34
MJ. Blin et M. CsernelPoleInfo334 // methode appelee a la rencontre de données public void characters (char val[], int valStart, int valLong) { /* construction d'un String egal a la valeur transmise en parametre */ StringBuffer dest = new StringBuffer(valLong); for (int i = valStart; i <= valStart+valLong-1; i++) { dest=dest.append(val[i]); } // fin du for String s1=dest.toString().trim(); int x = s1.indexOf("\n"); if (x==0) return; if (x!= -1) s1= s1.substring(0, x); /* affichage de la valeur */ if (s1.length() != 0) fen2.addValeur(s1); } // fin de la methode characters // methode appelee a la rencontre d'une balise de fermeture public void endElement(String namespaceURI, String sName,String qName ) throws SAXException { fen2.addFinElement(qName); } // fin de la methode endElement // traitement des erreurs fatales public void fatalError(SAXParseException err) { System.out.println("erreur fatale de parsing ligne no : " + err.getLineNumber()+"col:"+err.getColumnNumber() ); System.out.println ("uri " + err.getSystemId() + " "+err.getMessage ()); System.exit(0); } // fin de la methode fatalErrors // traitement des erreurs public void error (SAXParseException err) { System.out.println("erreur de parsing ligne no : " + err.getLineNumber()); System.out.println ("uri " + err.getSystemId() + " "+err.getMessage ()); System.exit(0); } // fin de la methode error // traitement des warnings public void warning(SAXParseException err) { System.out.println("attention ligne no : " + err.getLineNumber() + " " + err.getMessage ()); } // fin de la methode warning } // fin de la classe DomEcho
35
MJ. Blin et M. CsernelPoleInfo335 class AfficheResultats extends Frame { String indent=""; // pour l'indentation des messages dans la fenetre java.awt.List dataList = new java.awt.List(); String contenuElement = ""; AfficheResultats initialisation () { /* placement de la fenetre de resultats dans l'ecran */ int posX=200; // coordonnee x du coin superieure gauche int posY=100; // coordonnee y du coin superieur gauche this.setFont(new Font(null, Font.ROMAN_BASELINE,12)); int dimX=500; // largeur de la fenetre int dimY=500; // hauteur de la fenetre this.setBounds (posX, posY, dimX, dimY); this.setState(Frame.NORMAL); this.toFront(); this.setVisible(true); /* initialisation du traitement des evenements fenetre */ /* creation d'une classe interne pour traiter la fermeture de la fenetre */ this.addWindowListener (new WindowAdapter (){ public void windowClosing (WindowEvent e) { System.exit (0); } }); return this; } // fin de la methode initialisation void addElement(String s1) { indent=indent+" "; dataList.add(indent+"Element "+s1); } // fin de la methode addElement void addFinElement(String s1) { dataList.add(indent+"Fin d'element "+s1); indent = indent.substring(0,(indent.length()-13)); } // fin de la methode addFinElement void addAttribute (String s1, String s2) { dataList.add(indent+" Attribute "+s1+" = "+s2); } // fin de la methode addAttribute void debutDocument () { dataList.add("Debut document"); } // fin de la methode debutDocument void finDocument () { dataList.add("Fin document"); } // fin de la methode finDocument void addValeur (String s1) { dataList.add (indent+" Valeur = " + s1); } // fin de la methode addvaleur void affichageResultats () { /* affichage des resultats */ this.add(dataList); this.setVisible (true); } // fin de la methode affichageResultats } // fin de la classe AfficheResultats
36
MJ. Blin et M. CsernelPoleInfo336 Génération de fichiers XML à partir d’une structure de données quelconque /* Elements de programme qui transforme le contenu d'une base de données relationnelles en fichier xml */ /* soit une base de données composée de trois tables : la table personne : personne (idemploye, nom) la table adresse : adresse (idadresse, rue, ville, codePostal, idemploye) la table projet : projet (idprojet, projet, idemploye) Le fichier xml sera conforme a la DTD suivante : */ import java.io.* ; import java.util.*; import org.xml.sax.*; import org.xml.sax.helpers.AttributesImpl; import org.xml.sax.helpers.*; import org.xml.sax.helpers.XMLReaderAdapter; public abstract class BD_XML { public static void main (String [] args) throws SAXException, IOException { Vector tuplePersonne; SimulBD essai=new SimulBD(); EcrireXML e=new EcrireXML(); e.setContentHandler((ContentHandler) new Handler()); e.debutDocument(); /* si l'utilisateur tape return avant d'avoir saisie quoi que ce soit */ while (true) { tuplePersonne=null; tuplePersonne=essai.lireTuple("personne, un champ identEmploye et un champ nomEmploye"); if (tuplePersonne.isEmpty()==true) break; e.startElementEmploye(tuplePersonne); /* si l'utilisateur tape return avant d'avoir saisie quoi que ce soit */ Vector tupleAdresse=null; while (tupleAdresse==null) { tupleAdresse=essai.lireTuple("adresse, un champ identAdresse, un champ rue, un champ ville, un champ codePostal"); } // fin du while e.startElementAdresse(tupleAdresse);
37
MJ. Blin et M. CsernelPoleInfo337 /* si l'utilisateur tape return avant d'avoir saisie quoi que ce soit */ Vector tupleProjet=null; while (tupleProjet==null) { tupleProjet=essai.lireTuple("projet, un champ identProjet, un champ nomProjet"); } // fin du while e.startElementProjet(tupleProjet); while (tupleProjet != null) { tupleProjet=essai.lireTuple("projet"); if (tupleProjet.isEmpty()==true) break; e.startElementProjet(tupleProjet); } // fin du while e.finElement("employe"); } // fin du while sur plusieurs personnes e.finElement("baseEmployeProjet"); e.finDocument(); } // fin de la methode main } // fin de la classe BD_XML /* classe qui simule la base de données. Les tuples sont lus au clavier. Les valeurs de champ sont séparées par une virgule */ class SimulBD { BufferedReader clavier; String ligne=null; SimulBD() { clavier=new BufferedReader (new InputStreamReader(System.in)); } // fin du constructeur // méthode de lecture d'un tuple personne. Le tuple est mis dans la variable d'instance ligne Vector lireTuple (String nom) { System.out.print ("\n"+"\n"+"entrer un tuple "+nom+" en separant les valeurs de champs par une virgule : ") ; try { ligne=clavier.readLine() ; } // fin du try catch (IOException e) {} // l'utilisateur a tape un tuple Vector tuple=constitueTuple(); return tuple; } // fin de la methode lireTuple
38
MJ. Blin et M. CsernelPoleInfo338 /* La methode constitueTuple transforme le contenu du tuple saisi et stocké dans ligne en un vecteur de String. Chaque String est une valeur de champ du tuple */ Vector constitueTuple () { int longueurTraitee = 0; Vector t=new Vector(); while (longueurTraitee<ligne.length()) { int indiceVirgule=ligne.indexOf(",", longueurTraitee); if (indiceVirgule == -1) indiceVirgule=ligne.length(); String valeurChamp=ligne.substring(longueurTraitee, indiceVirgule); t.addElement(valeurChamp); longueurTraitee=indiceVirgule+1; } // fin du while return t; } // fin de la methode constitueTuple } // fin de la classe SimulBD class EcrireXML implements XMLReader { ContentHandler handler=null; String nsu=""; String root="baseEmployeProjet"; String indent="\n"; /* La methode debutDocument appelle la methode startDocument sur handler puis crée la racine de l'arbre DOM "baseEmployeProjet" */ void debutDocument() throws SAXException { if (handler==null) throw new SAXException("No content handler"); handler.startDocument(); Attributes atts=new AttributesImpl(); handler.startElement(nsu, root, root, atts); } // fin de la methode debutDocument /* La methode startElementEmploye crée un nœud "employe" dans l'arbre DOM, puis u nœud "nom" avec en donnée l'élément du vecteur de champs du tuple passé en parametre */ void startElementEmploye (Vector t) throws SAXException { handler.ignorableWhitespace("\n".toCharArray(), 0, // start index indent.length() // length ); String idEmploye=(String) t.elementAt(0); AttributesImpl atts=new AttributesImpl(); atts.addAttribute("","","idEmploye", "CDATA",idEmploye); handler.startElement (nsu, "employe","employe",atts); atts=new AttributesImpl(); handler.startElement (nsu, "nom", "nom",atts); String nomEmploye=(String) t.elementAt(1); handler.characters(nomEmploye.toCharArray(),0,nomEmploye.length()); finElement("nom"); } // fin de la methode startElementEmploye
39
MJ. Blin et M. CsernelPoleInfo339 /* methode appele en fin d'élément. En parametre, le nom d'element termine */ void finElement(String nom) throws SAXException { handler.endElement(nsu, nom, nom); } // fin de la methode finElement /* La methode startElementAdresse crée un nœud "adresse" dans l'arbre DOM, puis un nœud "rue" avec en donnée le premier élément du vecteur de champs du tuple passé en parametre, un nœud "ville" avec en donnée le deuxième élément du vecteur de champs du tuple passé en parametre, un nœud "codePostal" avec en donnée le troisieme élément du vecteur de champs du tuple passé en parametre */ void startElementAdresse (Vector t) throws SAXException handler.ignorableWhitespace("\n".toCharArray(), 0, // start index indent.length() // length ); String idAdresse=(String) t.elementAt(0); AttributesImpl atts=new AttributesImpl(); atts.addAttribute("","","idAdresse", "CDATA",idAdresse); handler.startElement (nsu, "adresse","adresse",atts); atts=new AttributesImpl(); handler.startElement (nsu, "rue", "rue",atts); String ts= (String) t.elementAt(1); handler.characters(ts.toCharArray(),0,ts.length()); finElement ("rue"); ts= (String) t.elementAt(2); handler.ignorableWhitespace("\n".toCharArray(), 0, // start index indent.length() // length ); handler.startElement (nsu, "ville", "ville",atts); handler.characters(ts.toCharArray(),0,ts.length()); finElement ("ville"); ts= (String) t.elementAt(3); handler.ignorableWhitespace("\n".toCharArray(), 0, // start index indent.length() // length ); handler.startElement (nsu, "codePostal", "codePostal",atts); handler.characters(ts.toCharArray(),0,ts.length()); finElement("codePostal"); finElement ("adresse"); } // fin de la methode startElementAdresse
40
MJ. Blin et M. CsernelPoleInfo340 /* La methode startElementProjet crée un nœud "projet" dans l'arbre DOM avec en donnée l'élément du vecteur de champs du tuple passé en parametre */ void startElementProjet (Vector t) throws SAXException { handler.ignorableWhitespace("\n".toCharArray(), 0, // start index indent.length() // length ); String idProjet=(String) t.elementAt(0); AttributesImpl atts=new AttributesImpl(); atts.addAttribute("","","idProjet", "CDATA",idProjet); handler.startElement (nsu, "projet","projet",atts); String ts=(String) t.elementAt(1); handler.characters(ts.toCharArray(),0,ts.length()); finElement("projet"); } // fin de la methode startElementProjet // methode appelee en fin de document void finDocument () throws SAXException { handler.endDocument(); } // fin de la methode finDocument public void setContentHandler(ContentHandler handler) { this.handler = handler; } public ContentHandler getContentHandler() { return this.handler; } public ErrorHandler getErrorHandler() { return null; } public boolean getFeature(String s) {return true; } public void setFeature (String s, boolean b) {return ; } public Object getProperty (String s) {return null;} public void setProperty (String s, Object o) {return;} public void setEntityResolver (EntityResolver e) {return;} public EntityResolver getEntityResolver () {return null;} public DTDHandler getDTDHandler () {return null;} public void setDTDHandler (DTDHandler d) {return;} public void parse(String s) {return; } public void parse(InputSource i) { return;} public void setErrorHandler (ErrorHandler e) {return;} } // fin de la classe EcrireXML
41
MJ. Blin et M. CsernelPoleInfo341 class Handler implements ContentHandler { FileWriter fic=null; int indent=-1; public void setDocumentLocator(Locator d) {} public void startPrefixMapping (String s1, String s2) { } public void endPrefixMapping (String s1) { } public void ignorableWhitespace(char[] c, int i1, int i2) { } public void processingInstruction (String s1, String s2) { } public void skippedEntity (String s1) { } Handler () throws IOException { String f1=null; /* preparation de la saisie du nom du fichier résultats au clavier */ BufferedReader clavier=new BufferedReader (new InputStreamReader(System.in)) ; System.out.print ("entrer le nom du fichier resultats : ") ; /* si l'utilisateur tape return avant d'avoir saisie quoi que ce soit */ while (fic==null) { try { f1=clavier.readLine()+".txt" ; } // fin du try catch (IOException e) {} try { /* le fichier existe-t-il ? */ File fichierResultats=new File ("d:\\marie-jo\\miage\\option3\\", f1) ; /* si fic est null, l'utilisateur n'a rien tape */ fic=new FileWriter(fichierResultats); } // fin du try /* cas ou l'utilisateur n'a pas saisi de nom de fichier */ catch (NullPointerException e) { System.out.println (" Vous devez taper un nom de ficher") ; } // fin du catch /* cas ou le fichier ne peut etre créé ou accédé */ catch (IOException e) { System.out.println ("Le fichier ne peut pas etre créé ou accédé") ; } // fin du catch } // fin du while } // fin du constructeur public void startDocument() throws SAXException { indent=-1; try { addLigne (" "); } // fin du try catch (IOException e) { System.out.println ("On ne peut pas ecrire dans le fichier résultats + ligne") ; } // fin du catch }
42
MJ. Blin et M. CsernelPoleInfo342 public void endDocument()throws SAXException { try { fermerResultats(); } // fin du try catch (IOException e) { System.out.println ("On ne peut pas ecrire dans le fichier résultats + ligne") ; } // fin du catch } public void startElement(String namespaceURI, String sName, String qName, Attributes attrs) throws SAXException { indent=indent+1; String eName = sName; // element name if ("".equals(eName)) eName = qName; // namespaceAware = false String s=sName; if (attrs != null) { for (int i = 0; i < attrs.getLength(); i++) { String aName = attrs.getLocalName(i); // Attr name if ("".equals(aName)) aName = attrs.getQName(i); s=s+" "+aName+"="+attrs.getValue(i); } // calcul du nombre d'espaces a indenter String nbreSpaces=""; for (int i=0;i<indent;i++) { nbreSpaces=nbreSpaces+" "; } // fin du for try { addLigne ("\n"+nbreSpaces+" "); } // fin du try catch (IOException e) { System.out.println ("On ne peut pas ecrire dans le fichier résultats + ligne") ; } // fin du catch } public void endElement(String namespaceURI, String sName, String qName) throws SAXException { String nbreSpaces=""; for (int i=0;i<indent;i++) { nbreSpaces=nbreSpaces+" "; } // fin du for try { addLigne ("\n"+nbreSpaces+" "); } // fin du try catch (IOException e) { System.out.println ("On ne peut pas ecrire dans le fichier résultats + ligne") ; } // fin du catch indent=indent-1; }
43
MJ. Blin et M. CsernelPoleInfo343 public void characters(char buf[], int offset, int len) throws SAXException { String s = new String(buf, offset, len); try { addLigne (s); } // fin du try catch (IOException e) { System.out.println ("On ne peut pas ecrire dans le fichier résultats + ligne") ; } // fin du catch } private void addLigne (String ligne) throws IOException { try { fic.write(ligne); } // fin du try catch (IOException e) { System.out.println ("On ne peut pas ecrire dans le fichier résultats + ligne") ; } // fin du catch } // fin de la methode addLigne void fermerResultats () throws IOException { try { fic.close(); } // fin du try catch (IOException e) { System.out.println ("On ne peut pas fermer le fichier résultats") ; } // fin du catch } // fin de la methode fermerResultats } // fin de la classe Handler
44
MJ. Blin et M. CsernelPoleInfo344 Traitement d'un fichier XML Les requêtes XPath pour sélectionner un ou des noeuds dans un arbre DOM utilisées dans le langage XSLT Symboles utilisés dans les requêtes / séparateur /. indique que la requête est un chemin absolu (qui démarre à la racine de l´arbre).. parent du noeud courant. noeud courant Requêtes portant sur des éléments:./h1/h2sélectionne tous les éléments h2 qui se trouvent sous tous les éléments h1 qui sont eux-mêmes sous le noeud courant./h1[4]/h2[5]sélectionne le 5ème élément h2 qui se trouve sous le 4ème élément h1 situé lui-même sous le noeud courant
45
MJ. Blin et M. CsernelPoleInfo345 Les requêtes XPath (suite) Requêtes portant sur des attributs LIST/@type sélectionne l´attribut type des élements LIST LIST[@type="unordered"] sélectionne tous les éléments LIST dont la valeur de l´attribut type égal unordered LIST[@type="ordered"][3] sélectionne le 3ème élément LIST dont l´attribut type = ordered LIST[3][@type="ordered"] sélectionne le 3ème élément LIST mais seulement si son attribut type = ordered
46
MJ. Blin et M. CsernelPoleInfo346 Les requêtes XPath (suite) Requêtes portant sur les champ texte Soit le fichier XML suivant : XML coursXML grande testProgrammes travail grande redactionDossier UML coursUML grande revisionExamen examen travail moyenne Les requêtes (voir plus loin pour la définition d´un champ texte) /activite[.=“revisionExamen“] sélectionne les éléments activite dont le champ texte = revisionExamen /activite[importance] sélectionne toutes les activites qui ont un élément fils importance /activite[importance=“grande"] sélectionne toutes les activites qui ont un élément fils importance dont le champ texte = grande
47
MJ. Blin et M. CsernelPoleInfo347 Opérateurs any : *n´importe quel élément node()n´importe quel noeud (élément, attribut, texte, commentaire,...) @*n´importe quel attribut //n´importe quel niveau de l´arborescence Exemples /*/activite[.=“travail"]sélectionne dans tous les projets les éléments activité dont le champ texte = travail //importance [.=“grande"]sélectionne à n´importe quel niveau de l´arborescence les éléments importance dont le champ texte = grande HEAD/LIST//PARA sélectionne tous les éléments PARA d´un document qui commence par l´arborescnce HEAD/LIST Les requêtes XPath (suite)
48
MJ. Blin et M. CsernelPoleInfo348 Les requêtes XPath (suite) Les chemins de localisation child::activite retourne les noeuds activite enfants du noeud contexte child::text() retourne tous les noeuds texte enfants du noeud contexte child::node() retourne tous les noeuds enfants du noeud contexte attribute::x retourne l'attribut x du noeud contexte descendant::importance retourne les noeuds importance descendants du noeud contexte descendant-or-self::importance retourne les noeuds importance descendants du noeud contexte ainsi que le noeud contexte s'il est un noeud importance ancestor::projet retourne les noeuds projet ancêtres du noeud contexte ancestor-or-self::projet retourne les noeuds projet ancêtres du noeud contexte ainsi que le noeud contexte s'il est un noeud projet self::projet retourne le noeud contexte s'il est un noeud projet preceding::* retourne tous les noeuds situés avant le noeud contexte dans l'ordre du document à l'exception des ancêtres du noeud contexte preceding-sibling::* retourne tous les noeuds frères situés avant le noeud contexte dans l'ordre du document following::* retourne tous les noeuds situés après le noeud contexte dans l'ordre du document à l'exception des descendants du noeud contexte following-sibling::* retourne tous les noeuds frères situés après le noeud contexte dans l'ordre du document parent::* retourne le noeud parent du noeud contexte
49
MJ. Blin et M. CsernelPoleInfo349 Les requêtes XPath (fin) Requêtes complexes Les opérateurs alternative. Exemple : PARA LIST Or, and, = !=,, =, +, -, *, div, mod Les fonctions. Quelques exemples last() /HEAD[last()] sélectionne le dernier élément HEAD position() HEAD[position() <= 5] sélectionne les 5 premiers éléments HEAD count(...) /HEAD[count(FILS)=0] sélectionne tous les éléments HEAD qui n´ont pas d´éléments fils HEAD concat(string, string,...) concaténation des chaînes starts-with(string1, string2) retourne vrai if string1 commence par string2 contains(string1, string2) retourne vrai si string1 contient string2 text() retourne le champ texte d´un élément exemple: UML travail /projet/activite/text() retourne travail /projet/text() retourne UMLtravail Pour la liste complète des fonctions voir http://www.java.sun.com/j2ee/1.4/docs/tutorial/doc/JAXPXSLT3.html How XPath works
50
MJ. Blin et M. CsernelPoleInfo350 Parcours d’un arbre DOM à l'aide de l'API XPath API XPath (log4j version 1.2.7) http://jakarta.apache.org/log4j/docs/download.html mettre le fichier.jar dans le répertoire chemin d´installation de java/jre/lib/ext Exemple de fichier XML 03/06/2002 21:06 62982 0.03 530000 66459 0.08 430000 65555 1.05 30500 65555 1.05 30500
51
MJ. Blin et M. CsernelPoleInfo351 import org.apache.xpath.*; import javax.xml.transform.*; class TraiteDom { void traitement (Document docIn) throws TransformerException { /* docIn est le Document produit par le parser Dom NodeList nodesSupport; NodeList nodesNoSicovam; NodeList nodesCours; NodeList nodesVolume; /* recuperation de l'element racine du document xml */ Element racine = docIn.getDocumentElement(); n = (Node) racine; /* Exploration de l'arbre Dom */ // recuperation de la date en tete du fichier xml String xpathDate = "date/text()"; Node nodeDate = XPathAPI.selectSingleNode (n, xpathDate); String date = nodeDate.getNodeValue(); String xpathSupport = "support"; nodesSupport= XPathAPI.selectNodeList (n, xpathSupport); for (int indiceSupport=0; indiceSupport<nodesSupport.getLength ();indiceSupport++) { // traitement des noeuds stockés dans le vecteur nodesSupport …………………………………………………….. Parcours d’un arbre DOM à l'aide de l'API XPath (suite) Traitement du fichier XML en Java
52
MJ. Blin et M. CsernelPoleInfo352 String xpathNoSicovam = "derive/noSicovam/text()"; nodesNoSicovam = XPathAPI.selectNodeList (supportCourant,xpathNoSicovam); for (int i = 0; i < nodesNoSicovam.getLength(); i++) { /* traitement des noeuds stockés dans le vecteur nodesnoSicovam */ ……………………………………………………….. String xpathCours = "derive/Cours/text()"; nodesCours = XPathAPI.selectNodeList(supportCourant,xpathCours); for (int i = 0; i < nodesCours.getLength(); i++) { /* traitement des noeuds stockés dans le vecteur nodesCours */ …………………………………………………………………… String xpathVolume = "derive/Volume/text()"; nodesVolume = XPathAPI.selectNodeList(supportCourant,xpathVolume); for (int i = 0; i < nodesVolume.getLength(); i++) { /* traitement des noeuds stockés dans le vecteur nodesCours */ …………………………………………………………………… Parcours d’un arbre DOM à l'aide de l'API XPath (fin)
53
MJ. Blin et M. CsernelPoleInfo353 Transformation d’un fichier XML en un fichier HTML ou un fichier texte ou un autre fichier XML Solution Java Le programme /* lecture d'un fichier xml et transformation en un fichier HTML grâce à une feuille de style */ import java.io.* ; import java.util.*; import javax.xml.parsers.*; import org.xml.sax.*; import org.w3c.dom.*; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamSource; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerConfigurationException; public class XML_HTML { public static void main (String [] args) throws IOException, ParserConfigurationException { /* lecture au clavier des noms des fichiers XML, feuille de style et HTML */ FileReader ficXML=null; File fichierXML=null; File fichierXSL=null; Document document=null;
54
MJ. Blin et M. CsernelPoleInfo354 while (ficXML==null) { fichierXML = LireNomFichier.lecture("entrer le nom du fichier XML original"); try { ficXML=new FileReader(fichierXML); } // fin du try catch (FileNotFoundException e) { System.out.println ("vous devez tape un nom de fichier existant"); } // fin du catch } // fin du while FileReader ficXSL=null; while (ficXSL==null) { fichierXSL = LireNomFichier.lecture("entrer le nom du fichier qui contient la feuille de style"); try { ficXSL=new FileReader(fichierXSL); } // fin du try catch (FileNotFoundException e) { System.out.println ("vous devez tape un nom de fichier existant"); } // fin du catch } // fin du while File fichierHTML = LireNomFichier.lecture("entrer le nom du fichier HTML a produire"); /* parsing du document XML */ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try { DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler( new org.xml.sax.ErrorHandler() { // ignore fatal errors (an exception is guaranteed) public void fatalError(SAXParseException err) throws SAXParseException {throw err;} // fin de la methode fatalErrors // treat validation errors as fatal public void error (SAXParseException err) throws SAXParseException {throw err;} // fin de la methode error // dump warnings too public void warning(SAXParseException err) throws SAXParseException { System.out.println("** Warning"+ ", line " + err.getLineNumber() + ", uri " + err.getSystemId()); System.out.println(" " + err.getMessage()); } // fin de la methode warning } // fin de la classe interne ); document = builder.parse(fichierXML); } // fin du try
55
MJ. Blin et M. CsernelPoleInfo355 catch (SAXParseException spe) { // Error generated by the parser System.out.println("\n** Parsing error" + ", line " + spe.getLineNumber() + ", uri " + spe.getSystemId()); System.out.println(" " + spe.getMessage() ); } // fin du catch catch (SAXException sxe) { // Erreurs generees durant le parsing Exception x = sxe; if (sxe.getException() != null) x = sxe.getException(); x.printStackTrace(); } // fin du catch /* creation d'un transformer avec la feuille de style */ StreamSource style = new StreamSource(fichierXSL); try { // Transformer transformer = tFactory.newTransformer(style); TransformerFactory tFactory =TransformerFactory.newInstance(); Transformer transformer = tFactory.newTransformer(style); /* transformation du fichier XML en un fichier HTML */ DOMSource source = new DOMSource (document); StreamResult result= new StreamResult (fichierHTML); transformer.transform (source, result); } // fin du try catch (TransformerConfigurationException tce) { // Error generated by the parser System.out.println ("\n** Transformer Factory error"); System.out.println(" " + tce.getMessage() ); // Use the contained exception, if any Throwable x = tce; if (tce.getException() != null) x = tce.getException(); x.printStackTrace(); } catch (TransformerException te) { // Error generated by the parser System.out.println ("\n"+"erreur dans la feuille de style"); System.out.println(" " + te.getMessage() ); // Use the contained exception, if any Throwable x = te; if (te.getException() != null) x = te.getException(); x.printStackTrace(); } } // fin du main } // fin de la classe XML_HTML
56
MJ. Blin et M. CsernelPoleInfo356 /* cette classe demande la frappe au clavier d'un nom de fichier */ class LireNomFichier { static File lecture (String message) throws IOException { File fichier=null; String f1=null; /* preparation de la saisie du nom du fichier au clavier */ BufferedReader clavier=new BufferedReader (new InputStreamReader(System.in)) ; System.out.print (message + " : ") ; while (f1==null) { try { f1=clavier.readLine() ; } // fin du try catch (IOException e) {} try { /* le fichier existe-t-il ? */ fichier=new File ("d:\\marie-jo\\miage\\option3\\", f1) ; } // fin du try /* cas ou l'utilisateur n'a pas saisi de nom de fichier */ catch (NullPointerException e) { System.out.println (" Vous devez taper un nom de fichier") ; } // fin du catch } // fin du while return fichier; } // fin de la méthode lecture } // fin de la classe LectureNomFichier
57
MJ. Blin et M. CsernelPoleInfo357 /* Ce programmelit un fichier xml, créé un arbre Dom et réécrit l'arbre DOM sur un autre fichier */ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.FactoryConfigurationError; import javax.xml.parsers.ParserConfigurationException; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.w3c.dom.Document; import org.w3c.dom.DOMException; import java.io.*; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; public class EcrireDom { static Document document; public static void main(String argv[]) { if (argv.length != 1) { System.out.println ("Lancer ce programme avec le chemin complet du fichier XML à lire en paramètre"); System.exit (1); } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try { // lecture du fichier xml et création de l'arbre Dom File f = new File(argv[0]); DocumentBuilder builder = factory.newDocumentBuilder(); document = builder.parse(f); // ecriture de l'arbre Dom sur la console de sortie en format xml TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer = tFactory.newTransformer(); DOMSource source = new DOMSource(document); StreamResult result = new StreamResult(System.out); transformer.transform(source, result); } // fin du try Ecriture d'un Document DOM en format xml
58
MJ. Blin et M. CsernelPoleInfo358 catch (SAXException sxe) { Exception x = sxe; if (sxe.getException() != null) { x = sxe.getException(); x.printStackTrace(); } catch (ParserConfigurationException pce) { pce.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } catch (TransformerConfigurationException tce) { System.out.println ("Transformer Factory error"); System.out.println(" " + tce.getMessage() ); Throwable x = tce; if (tce.getException() != null) { x = tce.getException(); x.printStackTrace(); } catch (TransformerException te) { System.out.println ("Transformation error"); System.out.println(" " + te.getMessage() ); Throwable x = te; if (te.getException() != null) { x = te.getException(); x.printStackTrace(); } } // fin du main } // fin de la classe EcrireDom
59
MJ. Blin et M. CsernelPoleInfo359 Ecriture d'un sous-arbre Dom au format xml /* Ce programmelit un fichier xml, créé un arbre Dom et réécrit l'arbre DOM sur un autre fichier */ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.FactoryConfigurationError; import javax.xml.parsers.ParserConfigurationException; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.w3c.dom.Document; import org.w3c.dom.DOMException; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import java.io.*; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; public class EcrireDom2 { static Document document; public static void main(String argv[]) { if (argv.length != 1) { System.out.println ("Lancer ce programme avec le chemin complet du fichier XML à lire en paramètre"); System.exit (1); } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try { // lecture du fichier xml et création de l'arbre Dom File f = new File(argv[0]); DocumentBuilder builder = factory.newDocumentBuilder(); document = builder.parse(f); NodeList list = document.getElementsByTagName("nom"); Node node = list.item(0); // ecriture de l'arbre Dom sur la console de sortie en format xml TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer = tFactory.newTransformer(); //DOMSource source = new DOMSource(document); DOMSource source = new DOMSource(node); StreamResult result = new StreamResult(System.out); transformer.transform(source, result); } // fin du try
60
MJ. Blin et M. CsernelPoleInfo360 catch (SAXException sxe) { Exception x = sxe; if (sxe.getException() != null) { x = sxe.getException(); x.printStackTrace(); } catch (ParserConfigurationException pce) { pce.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } catch (TransformerConfigurationException tce) { System.out.println ("Transformer Factory error"); System.out.println(" " + tce.getMessage() ); Throwable x = tce; if (tce.getException() != null) { x = tce.getException(); x.printStackTrace(); } catch (TransformerException te) { System.out.println ("Transformation error"); System.out.println(" " + te.getMessage() ); Throwable x = te; if (te.getException() != null) { x = te.getException(); x.printStackTrace(); } } // fin du main } // fin de la classe EcrireDom2
61
MJ. Blin et M. CsernelPoleInfo361 Le langage XSLT Pour écrire des feuilles de style définissant la présentation d'un document XML contenu de la feuille de style
62
MJ. Blin et M. CsernelPoleInfo362 Soit le document XML suivant : Texte d'exemple Ceci est le premier paragraphe de la premiere section Ceci est le deuxieme paragraphe de la premiere section Ceci est le premier paragraphe de la deuxieme section
63
MJ. Blin et M. CsernelPoleInfo363 Avec la feuille de style suivante texte.xsl :
64
MJ. Blin et M. CsernelPoleInfo364 L'application de la feuille de style au document texte fournira le document formaté suivant : Texte d 'exemple Première section Ceci est le premier paragraphe de la première section Ceci est le deuxième paragraphe de la première section Deuxième section Ceci est le premier paragraphe de la deuxième section Application du template texte Application du template paragraphe Application du template section Application du template section Application du template paragraphe Application du template titreTexte
65
MJ. Blin et M. CsernelPoleInfo365 Les éléments xsl:include ou xsl:import exemple avec le fichier regles.xsl <xsl:stylesheet version=1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
66
MJ. Blin et M. CsernelPoleInfo366 L'élément <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> avec le fichier regles.xsl <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
67
MJ. Blin et M. CsernelPoleInfo367 Résultats Texte d 'exemple Premiere section Ceci est le premier paragraphe de la premiere section Ceci est le deuxieme paragraphe de la premiere section Deuxieme section Ceci est le premier paragraphe de la deuxieme section
68
MJ. Blin et M. CsernelPoleInfo368 Les motifs de concordance (match patterns) expressions Xpath exemples : Ceci est le premier paragraphe de la première section Ceci est le deuxième paragraphe de la première section Ceci est le premier paragraphe de la deuxième section ou texte est le noeud contexte et xsl:value-of select="titreTexte"/> signifie : le noeud titreTexte enfant du neud contexte)
69
MJ. Blin et M. CsernelPoleInfo369 L'élément, Ceci est le premier paragraphe de la première section, Ceci est le deuxième paragraphe de la première section, Ceci est le premier paragraphe de la deuxième section, L'option indent Les éléments xsl:copy et xsl:copy-of Résultats Résultats
70
MJ. Blin et M. CsernelPoleInfo370 Résultats MJ. Blin 20 19.5 M. Csernel 20 19.5 Résultats MJ. Blin M. Csernel
71
MJ. Blin et M. CsernelPoleInfo371 Modèle d'attributs Résultats Premiere section Ceci est le premier paragraphe de la premiere section Ceci est le deuxieme paragraphe de la premiere section Deuxieme section Ceci est le premier paragraphe de la deuxieme section
72
MJ. Blin et M. CsernelPoleInfo372 Règles par défaut <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> Résultats Texte d 'exemple Ceci est le premier paragraphe de la premiere section Ceci est le deuxieme paragraphe de la premiere section Ceci est le premier paragraphe de la deuxieme section Suppression de contenu Texte d 'exemple Premiere section Deuxieme section Résultats
73
MJ. Blin et M. CsernelPoleInfo373 Priorités entre les templates on supprime les contenus des paragraphes Résultats Texte d 'exemple on supprime les contenus des paragraphes on supprime les contenus des paragraphes on supprime les contenus des paragraphes
74
MJ. Blin et M. CsernelPoleInfo374 L'élément On est sur titre On est sur section On est sur paragraphe
75
MJ. Blin et M. CsernelPoleInfo375 Précisions sur l'élément pour localiser des éléments ~ ~ Précisions sur l'élément ~ avec * pour n'importe lequel n pour un nom de noeud ou. pour le noeud contexte sélection de n'importe quel noeud
76
MJ. Blin et M. CsernelPoleInfo376 Les prédicats sélection des noeuds section qui ont un noeud fils paragraphe sélection de tous les noeuds qui ont un noeud fils paragraphe sélection des noeuds section qui ont un attribut titreSection sélection des noeuds section qui ont un attribut titreSection dont la valeur est Première section Utilisation de fonctions et d'opérateurs dans les prédicats | and != différent < inférieur <=inférieur ou égal =égal >supérieur >=supérieur ou égal notinverse le sens logique d'une expression + - * div mod position() last() ceiling() floor() round() sum() + toutes les fonctions déjà citées dans le chapitre sur XPath Exemples :
77
MJ. Blin et M. CsernelPoleInfo377 XSLT est un vrai langage de programmation avec une série d'instructions comprenant des instructions de boucle et de test Exemple : création d'une table des matières du document texte La définition XSLT suivante : fournira le document suivant : Premiere section Deuxieme section
78
MJ. Blin et M. CsernelPoleInfo378 L'élément exemple : : Cette section comporte 1"> paragraphes paragraphe
79
MJ. Blin et M. CsernelPoleInfo379 Texte d 'exemple Texte d 'exemple Premiere section : Cette section comporte 2 paragraphes Deuxieme section : Cette section comporte 1 paragraphe Résultats
80
MJ. Blin et M. CsernelPoleInfo380 Les éléments,, : Cette section comporte 1"> paragraphes paragraphe
81
MJ. Blin et M. CsernelPoleInfo381 L'élément Texte d 'exemple Texte d 'exemple Ceci est le premier paragraphe de la premiere section Ceci est le deuxieme paragraphe de la premiere section Résultats
82
MJ. Blin et M. CsernelPoleInfo382 L'élément utilisé à l'intérieur des éléments xsl:for-each ou xsl:apply-templates Soit le fichier xml : MJ. Blin 20 19,5 M. Csernel 20 19,5 Liste des étudiants Liste des étudiants : et la feuille de style notes.xsl :
83
MJ. Blin et M. CsernelPoleInfo383 Résultats Feuille de style équivalente Liste des étudiants Liste des étudiants Liste des étudiants Liste des étudiants MJ. Blin : genieLogiciel 19.5 optionMiage3 20 M. Csernel : genieLogiciel 19.5 optionMiage3 20
84
MJ. Blin et M. CsernelPoleInfo384 L'élément Liste des étudiants Liste des étudiants. Résultats Liste des étudiants Liste des étudiants 1.MJ. Blin 2.M. Csernel
85
MJ. Blin et M. CsernelPoleInfo385 Valeurs possibles de l'attribut format 11, 2, 3,... 0101, 02, 03,... aa, b, c,..., aa, ab,... AA, B, C,..., AA, AB,... ii, ii, iii, iv, v, vi,... II, II, III, IV, V, VI,... Liste des étudiants Résultats Liste des étudiants 1. 1.1. MJ. Blin 1.2. 20 1.3. 19.5 2. 2.1. M. Csernel 2.2. 20 2.3. 19.5
86
MJ. Blin et M. CsernelPoleInfo386 public class float Calcul { Vector notes=new Vector(); void stocke(float n) { notes.add(n); } float moyenne () { float somme=0; for (i=0;i<notes.length();i++) { somme+=notes[i]; } return somme/(notes.length()); } Liste des étudiants Liste des étudiants, moyenne= L'élément
87
MJ. Blin et M. CsernelPoleInfo387 L'extensibilité de XSLT possibilité d'appeler des fonctions Java ou javascript <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:Date="http://java.sun.com/java.util.Date">
88
MJ. Blin et M. CsernelPoleInfo388 Autre exemple Soit le fichier etudiant.xml MJ. Blin 20 19.5 M. Csernel 20 19.5 le fichier moyenne.xsl <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1" xmlns:Calcul="file:///d:/Calcul/"> Liste des étudiants Liste des étudiants, moyenne=
89
MJ. Blin et M. CsernelPoleInfo389 le fichier d:\Calcul.java import java.util.*; public class Calcul { static float notes[]=new float[10]; static int nbreNotes=0; public static String stocke(String n) { Float n2=new Float(n); float n3=n2.floatValue(); notes[nbreNotes]=n3; nbreNotes+=1; return n; } // fin de la méthode stocke public static float moyenne () { float somme=0; for (int i=0;i<nbreNotes;i++) { somme+=notes[i]; } return somme/nbreNotes; } // fin de la méthode moyenne } // fin de la classe Calcul Résultats Liste des étudiants Liste des étudiants MJ. Blin, moyenne=19.75 M. Csernel, moyenne=19.75
90
MJ. Blin et M. CsernelPoleInfo390 L' élément pour générer des éléments dans le document résultat Liste d'étudiants Résultats Liste d'étudiants MJ. Blin 20 19.5 M. Csernel 20 19.5
91
MJ. Blin et M. CsernelPoleInfo391 L' élément pour générer des attributs dans le document résultat Liste d'étudiants Résultats MJ. Blin M. Csernel
92
MJ. Blin et M. CsernelPoleInfo392 L' élément pour générer des commentaires dans le document résultat Liste d'étudiants Ici etait place un element note Résultats Liste d'étudiants MJ. Blin M. Csernel
93
MJ. Blin et M. CsernelPoleInfo393 L'élément pour lire et traiter plusieurs documents Soit les fichiers etudiant.xml : MJ. Blin M. Csernel notes.xml 20 19,5 20 19,5
94
MJ. Blin et M. CsernelPoleInfo394 et notes.xsl Liste d'étudiants : Résultats Liste d'étudiants MJ. Blin> optionMiage3 : 20 genieLogiciel : 19,5 M. Csernel optionMiage3 : 20 genieLogiciel : 19,5
95
MJ. Blin et M. CsernelPoleInfo395 Les éléments, et Liste d'étudiants :
96
MJ. Blin et M. CsernelPoleInfo396 Transformation du fichier XML créé par lecture de la base EmployeProjet en un fichier html ayant la présentation suivante : employé nom : MJ.Blin adresse : Place du Mal de Lattre de Tassigny, Paris- 75775 projet : Base de données Génie logiciel employé nom : M. Csernel adresse : Place du Mal de Lattre de Tassigny, Paris- 75775 projet : Langage C Structure de Données baseEmployeProjet
97
MJ. Blin et M. CsernelPoleInfo397 baseEmployeProjet.xml MJ.Blin Place du Mal de Lattre de Tassigny Paris 75775 Base de données Génie logiciel M. Csernel Place du Mal de Lattre de Tassigny Paris 75775 Langage C Structure de Données
98
MJ. Blin et M. CsernelPoleInfo398 Fichier xsl baseEmployeProjet employé nom : adresse :, - projet :
99
MJ. Blin et M. CsernelPoleInfo399 Fichier html produit baseEmployeProjet employé nom : MJ.Blin adresse : Place du Mal de Lattre de Tassigny, Paris- 75775 projet : Base de données Génie logiciel employé nom : M. Csernel adresse : Place du Mal de Lattre de Tassigny Paris- 75775 projet : Langage C Structure de Données
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.