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 nœuds 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 nœuds de type text et comment. Nous allons maintenant légèrement modifier notre boucle afin de n'afficher à l'écran que les nœuds é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.