L'analyse XML

Computer Science - XML and Java · course

Voir tous les documents en programmation

LICENCE FONDAMENTALEEN INFORMATIQUELFI-3L'analyse XMLR alis par : OMRANI HamzaD partement InformatiqueFacult des Sciences de Tunis PLANI.IntroductionII.DOMIII.API DOM1.Introduction a L'API2.Les principaux l mentsIV.Exemple d'utilisation en Java1.Lire un document XML2.Ecrire un document XMLV.Conclusion I.Introduction XML est uniquement un langage de structuration et de repr sentation de donn es. Il ne comporte pas d'instructions de contr le et ne permet donc pas d'exploiter directement les donn es. Pour r aliser des applications XML, il faut donc avoir recourt aux langages de programmation classiques (Java, PHP, C++, Python...). Un analyseur syntaxique XML (ou parseur), permet de r cup rer dans une structure XML, des balises, leur contenus, leurs attributs et de les rendre accessibles. Le parseur sert donc "d couper" le fichier de donn es en un ensemble de"mots" (tokens) et les mettre disposition d'applications. Exemple de parseur XML : Parseur XML DOM Parseur XML SAX II.DOM (Document Object Model) DOM ou Document Object Model, son nom complet, est ce qu'on appelle un parseur XML, c'est- -dire, une technologie gr ce laquelle il est possible de lire un document XML et d'en extraire diff rentes informations ( l ments, attributs, commentaires, etc...) afin de les exploiter. En r alit , lorsque votre document XML est lu par un parseur DOM, le document est repr sent en m moire sous la forme d'un arbre dans lequel les diff rents l ments sont li s les uns aux autres par une relation parent/enfant. Il est ensuite possible de passer d'un l ment un autre via un certain nombre de fonctions Je vous propose d'illustrer cette notion d'arbre gr ce un exemple. Soit le document XML suivant : III.API DOMI.1.Introduction l'API L'API DOM d crit un ensemble de m thodes, classes et interfaces (elle se base en effet sur la programmation orient objet) permettant de naviguer et de cr er un document de type XML Il est tr s important de noter que DOM est une recommandation compl tement ind pendante de toute plate-forme et langage de programmation. Aujourd'hui, La plupart des langages de programmation propose leur impl mentation de DOM : Java , C ++ , C# , PHP , ect & I.2.Les principaux l ments Toutes les classes et interfaces sont regroup es dans le package org.w3c.dom Chaque type d'entit qui compose l'arbre est d fini dans une interface. L'interface de base est l'interface Node dont plusieurs autres interfaces h ritent. L'interface Node Chaque l ment de l'arbre est un noeud encapsul dans l'interface Node ou dans une de ses interfaces filles. Tous les diff rents noeuds qui composent l'arbre h ritent de cette interface. L'interface d finit plusieurs m thodes : La m thode getNodeType() permet de conna tre le type du noeud. Le type est tr s important car il permet de savoir ce que contient le noeud.Le type de noeud peut tre : L'interface NodeListe Cette interface d finit une liste ordonn e de noeuds suivant l'ordre du document XML. Elle d finit deux m thodes : Cette interface d finit les caract ristiques pour un objet qui sera la racine de l'arbre DOM. Cette interface h rite de l'interface Node. Un objet de type Document poss de toujours un type de noeud DOCUMENT_NODE. L'interface Document L'interface Element Cette interface d finit des m thodes pour manipuler un l ment et en particulier les attributs d'un l ment. Un l ment dans un document XML correspondant un tag. L'interface Element h rite de l'interface Node. Un objet de type Element toujours pour type de noeud ELEMENT_NODE L'interface CharacterData Cette interface d finit des m thodes pour manipuler les donn es de type PCDATA d'un noeud. L'interface Attr Cette interface d finit des m thodes pour manipuler les attributs d'un l ment. L'interface Comment Cette interface permet de caract riser un noeud de type commentaire. Cette interface tend simplement l'interface CharacterData. Un objet qui impl mente cette interface g n rera un tag de la forme <!-- --> . L'interface Text Cette interface permet de caract riser un noeud de type Text. Un tel noeud repr sente les donn es d'un tag ou la valeur d'un attribut. IV.Exemple d'utilisation en Java IV.1.Lire un document XMLMise en place du code tape 1 : r cup ration d'une instance de la classe "DocumentBuilderFactory" DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance();Cette ligne de code s'accompagne de l'importation du package : import javax.xml.parsers.DocumentBuilderFactory; tape 2 : cr ation d'un parseur Try { DocumentBuilder builder = factory.newDocumentBuilder(); } catch (ParserConfigurationException e) { e.printStackTrace(); }Pour pouvoir utiliser la classe DocumentBuilder, le package suivant est n cessaire : import javax.xml.parsers.DocumentBuilder; tape 3 : cr ation d'un DocumentCette tape consiste cr er un Document partirde la parseur de l' tape 2. Plusieurs possibilit s s'offre alors vous : A partir d'un fichier. A partir d'un flux.Ce flux peut par exemple tre le r sultat de l'appel un web service. Dans notre exemple, c'est un fichier qui est utilis : Document document = builder.parse( new File("repertoire.xml") );Comme chaque nouvelle instruction, des packages doivent tre import s : import java.io.File; import org.w3c.dom.Document;un Document repr sente le document XML dans son int gralit . Il contient son prologue et son corps. Nous allons pouvoir le v rifier en affichant les l ments du prologue, savoir : La version XML utilis e. L'encodage utilis . //Affiche la version de XML System.out.println(document.getXmlVersion()); //Affiche l'encodage System.out.println(document.getXmlEncoding()); tape 4 : r cup ration de l'Element racineDans cette quatri me tape, nous allons laisser de c t le prologue et tenter de nous attaquer au corps du document XML. Pour ce faire, nous allons extraire l'Element racine du Document. C'est partir de lui que nous pourrons ensuite naviguer dans le reste du document.Pour r cup rer l' l ment racine, il suffit d' crire de faire appel la methode getDocumentElement() de notre document : Element racine = document.getDocumentElement();pour pouvoir utiliser l'interface Element, le package suivant doit tre import : import org.w3c.dom.Element;Nous pouvons d s maintenant v rifier que ce que nous venons de r cup rer est bien l' l ment racine en affichant son nom : System.out.println(racine.getNodeName()); //Affichage : repertoire tape 5 : r cup ration des personnesPour r cup rer tous les noeuds enfants de la racine, voici la ligne de code crire: NodeList racineNoeuds = racine.getChildNodes();Il vous faudra galement importer le package suivant : import org.w3c.dom.NodeList; On va afficher le nom de chacun des nSuds via le code suivant : int nbRacineNoeuds = racineNoeuds.getLength(); for (int i = 0; i<nbRacineNoeuds; i++) { System.out.println(racineNoeuds.item(i).getNodeName()); }Vous devriez alors avoir le r sultat suivant : / #text #comment #text personne #text /On retrouve bien notre balise <personne /> au milieu d'autres nSuds de type text et comment. Nous allons maintenant l g rement modifier notre boucle afin de n'afficher l' cran que les nSuds tant des l ments. Gr ce la m thodegetNodeType() de l'interface Node : for (int i = 0; i<nbRacineNoeuds; i++) { if(racineNoeuds.item(i).getNodeType() == Node.ELEMENT_NODE) { Node personne = racineNoeuds.item(i); System.out.println(personne.getNodeName()); } } //Affichage : personne Nous allons tenter d'afficher le sexe de la personne, qui pour rappel est un attributLa m thode la plus g n rique est de faire appelle getAttribute(String) de l'interface Element qui nous renvoie la valeur de l'attribut sp cifi en param tre. for (int i = 0; i<nbRacineNoeuds; i++) { if(racineNoeuds.item(i).getNodeType() == Node.ELEMENT_NODE) { Element personne = (Element) racineNoeuds.item(i); System.out.println(personne.getNodeName()); System.out.println("sexe : " + personne.getAttribute("sexe")); } } / personne sexe : masculin / tape 6 : r cup ration du nom et du pr nomNous allons maintenant r cup rer le nom et le pr nom des personnes pr sentes dans notre document XML. Puisque nous savons exactement ce que l'on souhaite r cup rer, nous allons y acc der directement via la m thode getElementsByTagName(String) de l'interface Element. Cette m thode nous renvoie tous l ments contenus dans l' l ment et portant le nom sp cifi . Element nom = (Element) personne.getElementsByTagName("nom").item(0); System.out.println(nom.getTextContent()); //Affichage : DEO tape 7 : r cup ration des num ros de t l phone NodeList telephones = personne.getElementsByTagName("telephone"); int nbTelephonesElements = telephones.getLength(); for(int j = 0; j<nbTelephonesElements; j++) { Element telephone = (Element) telephones.item(j); System.out.println(telephone.getAttribute("type") + " : " + telephone.getTextContent()); } / fixe : 01 02 03 04 05 Portable : 06 07 08 09 10 / IV.1.Ecrire un document XMLMise en place du code tape 1 : r cup ration d'une instance de la classe "DocumentBuilderFactory" tape 2 : cr ation d'un parseur tape 3 : cr ation d'un DocumentLa trosi me tape consiste cr er un Document vierge. Ce document est cr partir de notre parseur : Document document= builder.newDocument(); tape 4 : cr ation de l'Element racineLa cr ation de l' l ment racine se fait via notre parseur et plus particuli rement la methode createElement(String) de l'interface Document qui prend en param tre le nom que l'on souhaite donner la balise : Element racine = document.createElement("repertoire");Maintenant que notre l ment racine est d clar , nous pouvons l'ajouter notre document : document.appendChild(racine); tape 5 : cr ation d'une personneSi l'on regarde le document XML que l'on doit cr er, on s'aper oit qu'avant de cr er la balise <personne/>, nous devons cr er un commentaire.La cr ation d'un commentaire se fait via la methode createComment(String) du parseur qui prend comme param tre le fameux commentaire : Comment commentaire = document.createComment("John DOE"); racine.appendChild(commentaire);n'oubliez pas d'importer le package suivant : import org.w3c.dom.Comment;Nous pouvons maintenant nous attaquer la cr ation de la balise <personne /> Element personne = document.createElement("personne");Pour ajouter un attribut un l ment est en r alit tr s simple et se fait via la m thode setAttribute(String , String) de la l'interface Element. Cette m thode prend deux param tres : le nom de l'attribut et sa valeur. personne.setAttribute("sexe", "masculin");Puis ajouter l'element a la racine : racine.appendChild(personne); tape 6 : cr ation du nom et du pr nom Element nom = document.createElement("nom"); Element prenom = document.createElement("prenom");Ici, La nouveaut concerne le renseignement de la valeur contenu dans les balises, savoir John DOE dans notre exemple. Pour ce faire, il convient d'ajouter nos balises un enfant de type Text. Cet enfant doit tre cr avec la m thode createTextNode(String) du document qui prend en param tre la valeur : nom.appendChild(document.createTextNode("DOE") ); prenom.appendChild(document.createTextNode("John") );Puis ajouter les elements nom et le prenom a l'element personne : personne.appendChild(nom); personne.appendChild(prenom); tape 7 : cr ation des num ros de t l phone Element telephones = document.createElement("telephones"); Element fixe = document.createElement("telephone"); fixe.appendChild(document.createTextNode("01 02 03 04 05")); fixe.setAttribute("type", "fixe"); Element portable = document.createElement("telephone"); portable.appendChild(document.createTextNode("06 07 08 09 10")); portable.setAttribute("type", "portable"); telephones.appendChild(fixe); telephones.appendChild(portable); personne.appendChild(telephones); tape 8 : affichage du r sultatIl est maintenant temps de passer la derni re tape qui consiste afficher notre document XML fra chement cr . Deux possibilit s s'offrent nous : Dans un document XML. Dans la console de l'IDE.Pour pouvoir afficher notre document XML, nous allons avoir besoin de plusieurs objets Java. Le premier est une instance de la classe TransformerFactory : TransformerFactory transformerFactory = TransformerFactory.newInstance();La r cup ration de cette instance s'accompagne de l'importation du package suivant : import javax.xml.transform.TransformerFactory;Nous allons utiliser cette instance pour cr er un objet Transformer. C'est gr ce lui que nous pourrons afficher notre document XML par la suite : Transformer transformer = transformerFactory.newTransformer();Packages : import javax.xml.transform.Transformer; Pour afficher le document XML, nous utiliserons la m thode transform(DOMSource source , StreamResult sortie) de notre transformer : DOMSource source = new DOMSource(document); StreamResult sortie = new StreamResult(new File("F:\\file.xml"));Les packages : import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult;Nous allons renseigner ses diff rentes propri t s via la m thode setOutputProperty() de notre transformer qui prend en param tre le nom du param tre et sa valeur : transformer.setOutputProperty(OutputKeys.VERSION, "1.0"); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");Pour pouvoir utiliser les constantes de la classe OutputKeys, il convient d'importer le package suivant : import javax.xml.transform.OutputKeys;Si nous ex cutons notre programme maintenant, tout sera crit sur une seule ligne, ce qui n'est pas tr s lisible, alors : transformer.setOutputProperty(OutputKeys.INDENT, "yes");Puis, afficher le document XML : transformer.transform(source, sortie); IV.ConclusionDans ce cours, nous avons appris lire et crire du XML partir du Java. Nous avons aussi appris mieux comprendre le mod le DOM et, en particulier, sa structure en arbre. Vous devriez maintenant tre en mesure de commencer cr er des applications Java, de filtrer, fusionner et modifier du XML.