Gestion des fichiers XML avec JDOM

Gestion des fichiers XML avec JDOM

Présentation de l'API

JDom est une api qui permet de lire, éditer et écrire des fichiers XML.

L'api est téléchargeable ici : http://www.jdom.org

Fichier XML

Dans tout ce tutoriel, nous utiliserons le fichier XML suivant pour illustrer les explications :

<diagramme>
        <classe>
                <nom>Classe1</nom>
                <attribut>
                        <nom>attribut1</nom>
                        <type>String</type>
                        <valeur>valeur1</valeur>
                </attribut>
                <methode>
                        <nom>afficher</nom>
                        <retour>String</retour>
                </methode>
        </classe>
        <classe>
                <nom>Classe2</nom>
                <attribut>
                        <nom>VALEUR</nom>
                        <type>String</type>
                        <valeur>constante</valeur>
                        <static />
                </attribut>
        </classe>
</diagramme>

Lire le fichier XML

Parser le document

Pour lire le fichier XML, nous allons nous servir d'un parseur SAX qui permet de lire le fichier mais pas de l'éditer.
Pour instancier le parseur :

SAXBuilder builder = new SAXBuilder();

Pour parser le document, il suffit d'appeler la méthode build() du parseur en lui donnant le fichier à parser en argument :

SAXBuilder builder = new SAXBuilder();
File fichierXML = new File("d:\\diagramme.xml");
Document document = builder.build(fichierXML);

Le fichier est maintenant parsé : on peut accéder aux données en parcourant le document (résultat du parsing).

Récupérer les données

Pour récupérer les données, nous alloons utiliser l'élément racine du document XML, que nous récupérons de la manière suivante :

/* Racine du document XML : dans notre cas <diagramme> */
Element rootNode = document.getRootElement();

A partir d'un élément, nous pouvons accéder à tous ses éléments fils en utilisant la méthode getChildren(String nomFils)
Pour accéder au premier élément fils, on utilise la méthode getChild(String nomFils)
Par exemple :

/* pour accéder aux éléments classe */
List<Element> classes = rootNode.getChildren("classe")
/* Pour accéder au premier attribut */
classes.get(0).getChild("attribut");

Pour récupérer la valeur contenue dans une balise, on utilise la méthode getText() de la classe Element.

Afficher le contenu du fichier

Le code suivant permet de parcourir le fichier XML donné en exemple pour afficher ce qu'il contient.

import java.io.File;
import java.io.IOException;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;


public class AffichageDocument {

        public static void main(String[] args) {
                
                /* Création du parseur */
                SAXBuilder builder = new SAXBuilder();
                
                File fichierXML = new File("d:\\diagramme.xml");
                Document document;
                try {
                        /* Parsing du fichier */
                        document = builder.build(fichierXML);

                        /* Racine du document XML : dans notre cas <diagramme> */
                        Element rootNode = document.getRootElement();

                        /* On récupère tous les élément classe du fichier XML */
                        List<Element> liste = rootNode.getChildren("classe");

                        /* Boucle sur tous les éléments "classe" du fichier XML */
                        for (Element eClasse : liste) {
                                /* Affichage du nom du la classe */
                                System.out.println(eClasse.getChild("nom").getText());
                                
                                /* Récupération de tous les attributs de la classe */
                                List<Element> attributs = eClasse.getChildren("attribut");
                                for(Element eAttribut : attributs){
                                        String nomAttribut = eAttribut.getChildText("nom");
                                        String type = eAttribut.getChildText("type");
                                        String valeur = eAttribut.getChildText("valeur");
                                        
                                        /* Vérification de la présence de la balise <static> */
                                        Element eStatic = eAttribut.getChild("static");
                                        String stat="";
                                        if(eStatic!=null){
                                                stat="static ";
                                        }
                                        
                                        System.out.println("\t"+stat+type+" "+nomAttribut+"="+valeur);
                                }
                                List<Element> methodes = eClasse.getChildren("methode");
                                for(Element eMethode : methodes){
                                        String nomMethode = eMethode.getChildText("nom");
                                        String retour = eMethode.getChildText("retour");
                                        System.out.println("\t"+nomMethode+"():"+retour);
                                }
                        }
                }
                catch (JDOMException e) {
                        e.printStackTrace();
                } 
                catch (IOException e) {
                        e.printStackTrace();
                }
        }

}

Créer un fichier XML

Pour crééer un document XML, il suffit de créer les élements un par un en commencant par l'élément racine. Pour créer un élément, on utilise :

/* Création d'un élément */
Element element = new Element("nomBalise");
/* Affichage d'un texte entre les balises <element> et </element>*/
element.setText("Texte");
/* Affectation de l'élément à son père */
pere.addContent(element);

Une fois que la hiérarchie est créée, on enregistre le fichier de la manière suivante :

/* Création du document */
Document document = new Document(elementRacine);
XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
try {
        sortie.output(document, new FileOutputStream("D:\\fichier.xml"));
} 
catch (FileNotFoundException e) {
        e.printStackTrace();
} 
catch (IOException e) {
        e.printStackTrace();
}

Par exemple, pour créer le début du fichier XML donné en exemple :

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;


public class CreationDocument {
        
        public static void main(String[] args){
                
                /* Création de tous les éléments */
                Element racine = new Element("diagramme");
                Element classe1 = new Element("classe");
                Element nom1 = new Element("nom");
                nom1.setText("Classe1");
                Element attribut1 = new Element("attribut");
                Element nomAttribut = new Element("nom");
                nomAttribut.setText("attribut1");
                Element type = new Element("type");
                type.setText("String");
                Element valeur = new Element("nom");
                valeur.setText("valeur1");
                
                /* Création de la hiérarchie */
                racine.addContent(classe1);
                classe1.addContent(nom1);
                classe1.addContent(attribut1);
                attribut1.addContent(nomAttribut);
                attribut1.addContent(type);
                attribut1.addContent(valeur);
                
                /* Enregistrment */
                Document document = new Document(racine);
                XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
                try {
                        sortie.output(document, new FileOutputStream("D:\\diagramme2.xml"));
                } 
                catch (FileNotFoundException e) {
                        e.printStackTrace();
                } 
                catch (IOException e) {
                        e.printStackTrace();
                }
        }

}

Modifier un fichier XML

Le tableau suivant regroupe les méthodes principales qui permettent de modifier une arborescence.

Méthode Description
addContent Ajoute le contenu à la fin d'un élément ou si on précise un index, à la position voulue
removeChild Supprime le premier fils ayant le nom passé en attribut
removeChildren Supprime tous les fils ayant le nom passé en attribut
setText Donne un nouveau nom à l'élément
A voir également
Ce document intitulé « Gestion des fichiers XML avec JDOM » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous