IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

modification de données XML [XPATH]


Sujet :

Format d'échange (XML, JSON...) Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Par défaut modification de données XML
    Bonjour à tous.
    Tous les exemples de manipulation de données XML que je trouve sur le site font systématiquement reférence à une hierarchisation connue du document XML à modifier .
    Mon problème est tout autre : je souhaite modifier le contenu d'une balise d'un fichier XML , mais je ne connait pas son niveau de hierarchisation dans le fichier.

    j'ai fait la methode suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
       /**
        * @description : Cette methode recherche la 1ère balise "e" de l'element racine
        *                et modifie sa valeur avec "v"
        * @param e : Element à modifier
        * @param v : Avec le contenu de "v"
        */
       static void modifieElement(String e,String v)
       {
       	      racine.getChild(e).setText(v);
       }
    mon element racine est construit comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
       /**
        * Lecture du fichier (on le parse) 
        * et on initialise la racine de l'arborescence
        */ 
       static void lireFichier(String fichier) throws Exception
       {
          SAXBuilder sxb = new SAXBuilder();
          document = sxb.build(new File(fichier));
          racine = document.getRootElement();
       }
    La methode fonctionne parfaitement pour toutes les balises de niveau "1"
    mais des qu'il sagit d'aller modifier un element plus profondement dans l'arbre : c'est not good

    Le newbies java que je suit à besoin de vos conseil

    Que dois-je modifier dans la methode modifieElement pour rechercher la premiere BALISE du fichier (et la modifier) quelque soit son niveau de profondeur dans le Fichier ?

    Merci de votre aide
    cordialement
    @argoet

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    C'est à toi de parcourir tout ton arbre dans des boucles ou avec récursion. tu fait un getChildren, tu itère dessus, et si elle a le bon non, tu change, si non tu itére sur les fils de cell-ci recursivement puis tu passe à la suivante

  3. #3
    Membre chevronné
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Par défaut
    Merci à vous tchize

    ça peut servir :
    Alors voici mon code
    Et ça marche
    Soyez indulgent : (Je demarre avec java)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
       /**
        * @description : Cette methode va recherché la 1ère balise "e" de l'element racine
        *                et modifie sa valeur avec "v"
        * @param e : Element à modifier
        * @param v : Avec le contenu de "v"
        */
       static void modifieElement2(String e1,String v)
       {
    	   Element e;
    	   e=getLePremierFilsDe(racine,e1);
    	   if (e != null) {e.setText(v);}
       }
     
       /**
        * <pre>@description : Cette methode permet de chercher une balise dans un document XML 
        *                sans connaitre son niveau hierarchique 
        *                Elle renvoie à partir d'une racine "e" l'element correspondant
        *                à la "première" balise "b" trouvé dans le document
        *                cette methode renvoi null si la balise "b" n'existe pas
        *                l'utilisation recursive de cette methode est faite pour naviguer
        *                dans les "sous niveau" de la racine "e"</pre>
        *                
        * @param e : Element "parent"
        * @param b : la balise recherchée
        * @return Element
        * @exemple :       racine = document.getRootElement();
        *                  getLePremierFilsDe(racine,"PURGE")
        *                  On cherche la 1ere balise "<PURGE>" dans le document racine
        */
       static Element getLePremierFilsDe(Element e,String b)
       {
    	   if(e.getChild(b) != null) {return(e.getChild(b));}
    	   List les_fils = e.getChildren();    
    	   Iterator i = les_fils.iterator();
    	   // On a pas trouvé de fils sur la racine de "e" on va donc 
    	   // cherché sur les niveaux inférieurs
    	   // recursivité de la fonction "getLePremierFilsDe"
    	   while(i.hasNext())
    	      {
    	         Element courant = (Element)i.next();
    	         Element le_fils = getLePremierFilsDe(courant,b);
    	         if(le_fils != null) {return(le_fils);}
    	      }
           return((Element) null);
    	}

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Par défaut
    XPath permet de faire ce genre d'interrogations assez simplement :
    http://java.developpez.com/faq/xml/?...path#xpathnode
    L'expression XPath pour intéroger tous les noeuds 'test1' quelque soit leur niveau serait '//test1'.

  5. #5
    Membre chevronné
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Par défaut
    OK merci morbo : je regarde et je vous rend ma copie avec XPATH

  6. #6
    Membre chevronné
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Par défaut
    ça marche !!
    à noter qu'il m'a fallu aussi telecharger la bibliothèque "jaxen" (en plus de jdom) pour compiler
    ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    package T7;
     
    import java.io.*;
    import java.util.Iterator;
    import java.util.List;
     
    import org.jdom.*;
    import org.jdom.input.*;
    import org.jdom.output.*;
     
    import org.jdom.xpath.XPath;
     
    /**
     * @author argoet
     * Cette classe est un exemple de modification de fichier XML via XPATH
     */
    public class Modifie_XPATH
    {
    	static org.jdom.Document document;
    	static Element racine;
     
    	/**
             * 
             * @param args[0] : Fichier XML en entrée à modifier
             *        args{1] : Fichier resultat apres mofification
             */
    	public static void main(String[] args)
    	{
    		try
    		{
    			lireFichier(args[0]);
    			modifieElement("/PURGE","2812QY");
    			modifieElement("//MACHINE_DE_TRI","******************");
    			modifieElement("//COC_EM","====================");
    			modifieElement("/RE_ICI","#####################");
    			modifieElement("//RE_LAB","Yesssssssssssssssssss");
    			modifieElement("//TRUCMUCH","======================="); 
    			modifieElement("GENERAL","=======================");  
    			modifieElement("TRI/NOM","Le Nouveau nom de Trie"); 
    			modifieElement("//NOM","=======================");  
    			enregistreFichier(args[1]);
     
    			System.out.println("OK Terminé");
    		}
    		catch (Exception e) {e.printStackTrace();System.out.println("KO");System.exit(1);}
    	}
     
    	/**
             * Lecture du fichier (on le parse) 
             * et on initialise la racine de l'arborescence
             */ 
    	static void lireFichier(String fichier) throws Exception
    	{
    		SAXBuilder sxb = new SAXBuilder();
    		document = sxb.build(new File(fichier));
    		racine = document.getRootElement();
    	}
     
     
    	/**
             * @description : Cette methode recherche la 1ère balise "e1" de l'element racine
             *                et modifie sa valeur avec "v"
             * @param e1 : Element à modifier
             * @param v  : Avec le contenu de "v"
             */
    	static void modifieElement(String e1,String v)
    	{
    		try {
    			XPath xpa = XPath.newInstance(e1);
    			/* On récupère tous les noeuds répondant au chemin "e1" */
    			List results = xpa.selectNodes(racine) ;
     
    			Iterator iter = results.iterator() ;
    			/**
                             * On modifie que le 1er noeud
                             * Si l'on veut modifier tous les noeuds de type "e1"  
                             * il faut remplacer "if" par "while" 
                             */
    			if (iter.hasNext()){
    				/* Pour Le Premier Noeud */
    				Element e = (Element) iter.next();  
    				if (e != null) {e.setText(v);}else{System.out.println("("+e1 + ") n'existe pas");}
    			}
    		} catch (Exception e) {e.printStackTrace();System.out.println("KO");System.exit(1);}
     
    	}
     
     
    	//On enregsitre notre nouvelle arborescence "modifiée" dans fichier
    	static void enregistreFichier(String fichier) throws Exception
    	{
    		XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
    		sortie.output(document, new FileOutputStream(fichier));
    	}
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Mysql] Donnée XML >vers> BDD
    Par largiss dans le forum XQUERY/SGBD
    Réponses: 14
    Dernier message: 28/02/2017, 17h51
  2. Modification des donnes xml
    Par alen22 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 02/05/2011, 23h16
  3. [JDOM] Modification des données XML
    Par dimou59 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 20/04/2011, 14h41
  4. [xml]manipuler des données xml sous Oracle9i
    Par crazy dans le forum SQL
    Réponses: 7
    Dernier message: 28/02/2004, 11h40
  5. problème xsl : inclure une donnée xml dans une balise html
    Par djodjo dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 03/01/2003, 09h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo