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 :

Suppression de noeud avec conservation des fils [JDOM]


Sujet :

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

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 138
    Points : 156
    Points
    156
    Par défaut Suppression de noeud avec conservation des fils
    Bonjour,

    J'ai un problème un peu bizarre. J'ai une arborescence du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a><b><c>Bla</c></b></a>
    J'aimerais pouvoir la modifier en JDom pour obtenir :

    Donc en bref supprimer un noeud et garder ses fils...qui sont des textes.

    Merci par avance !

  2. #2
    Membre éprouvé Avatar de laurentibus
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 908
    Points
    908
    Par défaut
    mets ton code stp

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 138
    Points : 156
    Points
    156
    Par défaut
    Ma fonction de suppression en JDom :

    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
     
    static void supprElement(String element)
       {
    	   //Dans un premier temps on liste tous les étudiants
    	   List<Element> listeElements = racine.getChildren();
    	   Iterator<Element> i = listeElements.iterator();
    	   List<String> champs = new ArrayList<String>();
    	   while(i.hasNext()){
    		   Element courant = (Element)i.next();
    		   if(courant.getName().equals(element)){
    			   String champsFusion = courant.getText();
    			   System.out.println("Champs de fusion : " + champsFusion);
    			   champsFusion = champsFusion.replace("<", "${");
    			   champsFusion = champsFusion.replace(">", "}");
    			   System.out.println("Champs de fusion après modification : " + champsFusion);
    			   champs.add(champsFusion);
    		   }
    	   }
    	   int j = 0;
    	   do{
    		   System.out.println("On insère "+champs.get(j));
    		   racine.addContent(champs.get(j));
    		   j++;
    	   } while(racine.removeChild(element, racine.getNamespace("text")));
       	}
    et mon doc XML (juste la balise qui nous intéresse) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <text:p text:style-name="Standard">
      Bonjour 
      <text:database-display text:table-name="temp" text:table-type="table" text:column-name="MR_MME" text:database-name="temp5"><MR_MME></text:database-display> 
      <text:database-display text:table-name="temp" text:table-type="table" text:column-name="PRENOM" text:database-name="temp5"><PRENOM></text:database-display> 
      <text:database-display text:table-name="temp" text:table-type="table" text:column-name="NOM" text:database-name="temp5"><NOM></text:database-display> 
      !!!
      </text:p>
    J'aimerais en fait ici obtenir ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <text:p text:style-name="Standard">
      Bonjour <MR_MME> <PRENOM> <NOM> !!!
    </text:p>

  4. #4
    Membre éprouvé Avatar de laurentibus
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 908
    Points
    908
    Par défaut
    je ne pense pas qu il y est de methode pour qu on puisse garder une arborescence tout en supprimant un noeud quelques part.


    alors tu fais comme ca sauf que :
    avant de supprimer les fils de la racine tu enregistre leur valeur : <MR_MME> ou <PRENOM> ou <NOM> .... c'est a dire leur fils .
    tu supprime et tu met ensuite a la place leur fils


  5. #5
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 138
    Points : 156
    Points
    156
    Par défaut
    tu met ensuite a la place leur fils
    C'est bien ça que je ne sais pas faire

  6. #6
    Membre éprouvé Avatar de laurentibus
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 908
    Points
    908
    Par défaut
    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
     
    //Dans un premier temps on liste tous les étudiants
    	   List<Element> listeElements = racine.getChildren();
    	   Iterator<Element> i = listeElements.iterator();
    	   List<String> champs = new ArrayList<String>();
    //pour tous les element a supprimer	   
    while(i.hasNext()){
    		   Element courant = (Element)i.next();
     
    //on ajoute la valeur champFusion dans la racine a la fin 
    //liste des enfant (y en a q un)
    iterator ite= courant.getChildren.iterator()
    champFusion=ite.next()
    racine.addContent(champFusion)
     
    //la on supprime la ligne dans laquelle on vient de prendre le fils 
    racine.remove(courant)
     
    		   }

    bon les types et la syntax doit y avoir des erreurs mais a mon avis tu peux y arriver avec un truc dans ce style

    et pour verifier les types : JDomDoc

    tiens nous au jus ++

  7. #7
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2008
    Messages : 138
    Points : 156
    Points
    156
    Par défaut
    Re ! J'avais essayé ta solution mais sans résultat convaincant

    Bien heureusement, j'ai résolu mon problème tout seul, et Dieu sait que j'ai cherché ! Je vous en fait part :

    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
     
    static void supprElement(String element)
       {
               //Je récupère les noeuds que je veux supprimer	   
               List<Element> listeElements = racine.getChildren();
    	   Iterator<Element> i = listeElements.iterator();
               //Ces noeuds contiennent du texte, je mémorise donc leur index et le texte
    	   Map<Integer, Text> fusions = new HashMap<Integer, Text>();
    	   while(i.hasNext()){
    		   Element courant = (Element)i.next();
    		   if(courant.getName().equals(element)){
    			   //je remplace des caractères selon mes besoins
                               String champsFusion = courant.getText();
    			   champsFusion = champsFusion.replace("<", "${");
    			   champsFusion = champsFusion.replace(">", "}");
    			   //je remplis la map <Index, texte>
                               fusions.put(racine.indexOf((Content)courant), new Text(champsFusion));
    		   }
    	   }
               //Je récupère les clé de la map pour itérer dessus
    	   Set<Integer> indexes = fusions.keySet();
    	   Iterator<Integer> j = indexes.iterator();
    	   while(j.hasNext()){
    		   Integer indexCourant = j.next();
                       //je supprime le noeud que je ne veux plus
    		   racine.removeContent(indexCourant);
                       //je le remplace par son fils
    		   racine.addContent(indexCourant, fusions.get(indexCourant));
    	   }
       	}
    Voilou ! En espérant que ça aidera un jour quelqu'un

    Merci à toi laurentibus pour ton aide !!

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Supprimer noeud en gardant les fils...avec une feuille de style XSL
    Tres interessant le sujet.
    J'aurais aime savoir si je peux m'en sortir pour un probleme similaire mais avec une feuille XSL.
    Je travaille actuellement sur le XML OpenDocument d'un document OpenOffice :
    J'utilise un toolkit qui me cache la merde au chat pour dezipper/rezipper le package (ott, odt).
    Et j'ai un Runnner XSL.

    Ce que je fais est une fusion de document entre un modele et des donnees a l'identique de la macro MailMerge d'OpenOffice.

    Quand je compose le modele, pour ajouter des variables, textfields, je le fais contre une table de la base OpenOffice. Cela simplifiera la tache de la personne qui variabilise les modeles.
    En resultat , dans le content.xml du fichier ODT, j'ai cela :
    [...]Paris, le <text:database-display text:table-name="test.COURRIERS" text:table-type="table" text:column-name="DATE_JOUR" text:database-name="OOo mysql test Database">&lt;DATE_JOUR&gt;</text:database-display></text:p>[...]

    Chaque colonne de table se retrouve comme Text sous le tag database-display.

    Apres jeu de MailMerge (publipostage) d'openoffice, je m'apercois qu'il transforme ainsi >
    [...]Paris, le 17 juin 2008</text:p>[...]


    Sur le principe , un programme XSLTRunner du toolkit mange un modele ott , une feuille de style XSL (de laquelle je croise avec un fichier de donnees en XML)

    Je veux essayer donc de refaire ca avec la feuille de style XSL.
    Pour l'instant j'ai pu remplacer le Text Element fils de <database-display> par une valeur provenant du fichier XML.
    Mais pour remplacer directement <database-display> par un element texte , je seche un peu.

    Je souhaiterais si possible eviter de tout recoder cette transformation en Java. .

    Merci de votre aide

    Laurent

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

Discussions similaires

  1. Remplacer les blocks avec conservations des paramètres
    Par yamin69 dans le forum Simulink
    Réponses: 2
    Dernier message: 22/04/2013, 13h43
  2. Réponses: 5
    Dernier message: 06/07/2011, 00h50
  3. Réponses: 2
    Dernier message: 08/12/2009, 12h41
  4. Découpage de chaine avec conservation des séparateurs
    Par vdelbart dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 26/10/2007, 16h50
  5. créer un noeuds avec des paramétres
    Par Toxine77 dans le forum XMLRAD
    Réponses: 5
    Dernier message: 21/01/2003, 16h11

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