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 :

Ajouter des éléments dans un fichier XML [JDOM]


Sujet :

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

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 604
    Points : 206
    Points
    206
    Par défaut Ajouter des éléments dans un fichier XML
    Bonjour,
    J'ai un fichier xml contenant des données et je voudrais ajouté une balise.
    J'ai réussi a faire l'affichage des éléments du fichier xml, mais lorsque je fais un addContent (Parent.addContent(nomDelaBalise))
    quand je lance le programme, j'ai le fichier xml qui est affiché mais lorsqu'on arrive a l'endroit ou je veux ajouté la balise l'affichage du fichier s’interrompt et il est suivie de plusieurs lignes d'erreurs (dans la console)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Exception in thread "main" java.util.ConcurrentModificationException: The ContentList supporting the FilterList this iterator is processing has been modified by something other than this Iterator.
    	at org.jdom2.ContentList$FilterListIterator.checkConcurrent(ContentList.java:1309)
    	at org.jdom2.ContentList$FilterListIterator.next(ContentList.java:1357)
    	at org.jdom2.ContentList$FilterListIterator.next(ContentList.java:1260)
    	at TraitementJdom.testJdom(TraitementJdom.java:57)
    	at TraitementJdom.main(TraitementJdom.java:20)

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tu dois modifier une liste d'éléments en même temps que tu la parcours avec un Iterator, ce qui provoque un conflit. Avec le code, on pourrait te donner une solution pour résoudre ton problème.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 604
    Points : 206
    Points
    206
    Par défaut
    Bonjour,

    Je veux ajouté la balise "mention" apres la balise "diplome"

    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
     
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.text.Format;
    import java.util.List;
     
    import org.jdom2.Document;
    import org.jdom2.Element;
    import org.jdom2.JDOMException;
    import org.jdom2.input.SAXBuilder;
    import org.jdom2.output.XMLOutputter;
     
     
    public class TraitementJdom {
     
    	static Document document;
     
    	public static void main(String[] args) throws Exception 
    	{
    		TraitementJdom.testJdom("monCV.xml");		
    		enregistreFichier("NEWmonCV.xml");		
    	}
     
    	public static void testJdom(String fileName)
    	{
     
    	    XMLOutputter outp = new XMLOutputter();		
    	    Document document = null;
    	    File   file = new File(fileName);
    	    SAXBuilder builder = new SAXBuilder();
    	    try
    	    {
    	        document = builder.build(file); 
    	        Element root = document.getRootElement();	        
    	        System.out.println("<"+root.getName()+">");  // <---------------------- Début Racine	        
    	        List<Element> children = root.getChildren();	        
     
    	        for (Element c : children)	        {
    	        	System.out.println("	<"+c.getName()+">"); // <---------------------- Début Noeud		        	
    	        	List<Element> child = c.getChildren();
     
    	        	for (Element e : child)
    	        	{
     
    	        		List<Element> c2 = e.getChildren();
    	        		if (c2.size()>0) 
    	        		{
    	        			System.out.println("		<"+e.getName()+"> ");  // <------------------ Début Sous-Noeud
    	        			for (Element t   : c2)
    	        			{
    	        				System.out.print("			<"+t.getName()+">");  // <------------------ Début 	        				
    	        				System.out.print(t.getText()) ;	        				
    	        				System.out.println("</"+t.getName()+"> ");         // <------------------ Fin	        				
    	        				if (t.getName().equals("diplome"))
    	        				{ 	        					
    	        					addElement(e,"mention","");       					
     
    	        				}	        				
    	        			}	        			
    	        			System.out.println("		</"+e.getName()+">"); // <------------------ Fin Sous-Noeud
    	        		}
     
    	        		else
    	        		{ 
    	        			System.out.print("		<"+e.getName()+">");  // <------------------ Début Sous-Noeud
    	        			System.out.print(e.getText()) ; 
    	        			System.out.println("</"+e.getName()+">"); // <------------------ Fin Sous-Noeud
    	        		}
     
     
    	        	}
     
    	        	System.out.println("	</"+c.getName()+">"); // <---------------------- Fin Noeud
     
    	            //Extraire les donnees (attributes, values ...) ou parcourir en 
    	            // profondeur en fonction de child (noeud terminal ou arbre ....) 
    	        }
     
    	    System.out.println("</"+root.getName()+">");  // <---------------------- Fin Racine
     
    	    }
    	    catch (JDOMException e) 
    	    {
    	        System.err.println(e.getMessage());
    	    }
    	    catch (IOException e) 
    	    {
    	        System.err.println(e.getMessage());
    	    }
     
    	}
     
     
     
     
    	// ====================================== Item ajouté ====================================== \\
     
    	static void addElement(Element parent, String elementName, String textValue)
    	{
    		Element child = new Element(elementName);
    		child.setText(textValue);
    		parent.addContent(child);
    	}
     
     
    	// ====================================== Sauvegarde ====================================== \\
     
        static void enregistreFichier(String fichier) throws Exception
        {
              XMLOutputter sortie = new XMLOutputter();
              sortie.output(document, new FileOutputStream(fichier));
        }
     
    }
    Le code xml

    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
     
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <!DOCTYPE curriculumVitae SYSTEM "monCV.dtd">
     
     
    <CurriculumVitae>
     
     
    			<!-- Civilité -->
     
    	<Civilite> 	
     
    		<Prenoms>
    			<prenom> prenom </prenom>
    		</Prenoms>
     
    		<nom> nom </nom>
     
    		<email> email </email>
     
    		<adresse> adresse </adresse>
     
    		<NumTel>
    			<numTelFixe> numero du telephone fixe </numTelFixe>
    			<numPortable> numero de portable </numPortable>
    		</NumTel>
     
    	</Civilite>
     
     
    			<!-- Expérience	professionnelle -->
     
    	<XpPros> 
     
    		<Experience>
    			<date> mois année - mois année </date>
    			<poste> poste </poste>
    			<detail> detail </detail>
    		</Experience>
     
    	</XpPros>
     
     
    			<!-- Diplomes -->
     
    	<Diplomes>
     
     
        	<attestation>	
    			<annee> annee-annee </annee>
    			<diplome> diplome </diplome>
    			<ecole> ecole </ecole>
    		</attestation>
     
    		<attestation>
    			<annee> annee-annee </annee>
    			<diplome> diplome </diplome>
    			<ecole> ecole </ecole>
    		</attestation>
     
    		<attestation>
    			<annee> annee-annee</annee>
    			<diplome> diplome </diplome>
    			<ecole> ecole </ecole>
    		</attestation>
     
    	</Diplomes>
     
     
    </CurriculumVitae>

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    List<Element> c2 = e.getChildren();
     
    if (c2.size()>0) {
     
       for (Element t   : c2) {
     
          if (t.getName().equals("diplome")) { 	        					
    	 addElement(e,"mention","");       					
          }	        				
       }	        			
     
    }
    Tu parcours les fils de e, et si l'un d'eux est un élément "diplome", tu ajoutes dans l'élement e un nouveau fils : donc tu modifies la la liste de fils de e, et donc ça provoque une exception de type accès concurrent (ce qui se passerait aussi si tu faisais la même chose avec une ArrayList par exemple).

    Tu pars d'une structure comme ça (partiellement) :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <...>
        <diplome></diplome>
        <diplome></diplome>
    </...>
    Quelle structure essayes-tu d'obtenir ?

    1. celle-là :

      Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      <...>
          <diplome>
          </diplome>
          <diplome></diplome>
          <mention></mention>
          <mention></mention>
      </...>
    2. ou celle-ci
      Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      <...>
          <diplome>
               <mention></mention>
          </diplome>
          <diplome>
               <mention></mention>
          </diplome>
      </...>
    3. ou celle-ci
      Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      <...>
          <diplome></diplome>
          <mention></mention>
          <diplome></diplome>
          <mention></mention>
      </...>


    Pour la 2, c'est simple, il suffit d'ajouter l'élément <mention> à t au lieu de e.
    Pour la 1, pour éviter de modifier la liste de fils pendant que tu la parcours, tu peux, par exemple, parcourir une copie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    List<Element> c2 = new ArrayList<>(e.getChildren()); // on copie la liste : on pourra la parcourir en modifiant l'original sans problème
     
    if (c2.size()>0) {
     
       for (Element t   : c2) {
     
          if (t.getName().equals("diplome")) { 	        					
    	 addElement(e,"mention","");       					
          }	        				
       }	        			
     
    }
    Pour la 3, tu peux l'ajouter l'élement mention après l'élément trouvé et sortir de la boucle (break), en utilisant la méthode de copie de la solution du 1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    e.addContent(e.indexOf(t), newChild);
    Par ailleurs, il y a un autre problème dans ton programme : tu enregistres un document null (tu obtiendras une NullPointerException).

    Les modifications à faire :

    1. Récupère le document que tu construits en retour de la méthode testJdom

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      public static Document testJdom(String fileName) { // met Document à la place de void 
       
          Document document = null; 
       
          return document; // ajoute cette ligne à la fin de la méthode
       
      }
    2. Ajoute un paramètre à la méthode enregistreFichier
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
         static void enregistreFichier(Document document, String fichier) throws Exception // ajoute le paramètre document
         {
               XMLOutputter sortie = new XMLOutputter();
               sortie.output(document, new FileOutputStream(fichier)); // c'est le paramètre qui est utilisé et non plus la variable static
         }
    3. modifie la méthode main en conséquence et enlève la variable statique

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      	// static Document document;
       
      public static void main(String[] args) throws Exception {
       
      		Document document = TraitementJdom.testJdom("monCV.xml");		
      		enregistreFichier(document, "NEWmonCV.xml");		
       
      }

    Un autre problème est que s'il y a une erreur à la lecture, tu vas au mieux enregistrer un fichier incomplet, au pire avec une NullPointerException. Au lieu d'attraper les exceptions dans testJDom, fait un throws, et fait un catch global dans le main.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 604
    Points : 206
    Points
    206
    Par défaut
    Ce que je veux est bien la structure 3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <...>
        <diplome></diplome>
        <mention></mention>
        <diplome></diplome>
        <mention></mention>
    </...>
    mais je n'ai pas très bien compris certaine chose.

    j'ai bien ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    List<Element> c2 = new ArrayList<>(e.getChildren()); // on copie la liste : on pourra la parcourir en modifiant l'original sans problème
     
    if (c2.size()>0) {
     
       for (Element t   : c2) {
     
          if (t.getName().equals("diplome")) { 	        					
    	 addElement(e,"mention","");       					
          }	        				
       }	        			
     
    }
    mais pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    e.addContent(e.indexOf(t), newChild);
    je ne comprends pas ce qu'est newChild
    et je mets break après addElement ?

    Je ne sais pas ce qu'est vraiment un catch global, j'ai juste repris ces catch sur le web ^^

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Ce code, c'est juste pour l'exemple (j'y ai fait d'ailleurs une petite erreur : j'ai oublié le +1).

    Tu as actuellement une méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static void addElement(Element parent, String elementName, String textValue) {
    		Element child = new Element(elementName);
    		child.setText(textValue);
    		parent.addContent(child);
    }
    Qui ajoute après le dernier.

    Tu dois faire une nouvelle méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private static void addElementAfter(Element element, String elementName, String textValue) {
    		Parent parent = element.getParent();
    		Element newChild = new Element(elementName);
    		newChild.setText(textValue);
    		parent.addContent(parent.indexOf(element)+1, newChild);
    	}
    Et l'apeller à la place de l'autre.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 604
    Points : 206
    Points
    206
    Par défaut
    Ca fonction mais la balise mention s'ajoute juste après la balise diplome (dans mon fichier NEWmonCV.xml)
    comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <...>
        <diplome></diplome>
        <mention></mention>
        <diplome></diplome><mention></mention>
    </...>
    Comment faire pour avoir ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <...>
        <diplome></diplome>
        <mention></mention>
        <diplome></diplome>
        <mention></mention>
    </...>

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    C'est par le format de l'ouputter qu'on gère ce genre de chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Format format = Format.getPrettyFormat();
    format.setTextMode(TextMode.TRIM_FULL_WHITE);
    format.setExpandEmptyElements(true);
    XMLOutputter sortie = new XMLOutputter(format);
    Mais tu verras des petites différences avec ton fichier d'entrée (les lignes blanches de séparation).

    Le plus près qu'on puisse faire, à ma connaissance, c'est avec la bidouille suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Format format = Format.getPrettyFormat();
    format.setTextMode(TextMode.TRIM_FULL_WHITE);
    format.setExpandEmptyElements(true);
    format.setLineSeparator(LineSeparator.DEFAULT.value()+LineSeparator.DEFAULT.value());
    XMLOutputter sortie = new XMLOutputter(format);
    Pour faire exactement ton fichier d'entrée, à la limite, je pense qu'il faudrait passer par StAX.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 604
    Points : 206
    Points
    206
    Par défaut
    merci de votre aide

  10. #10
    Inactif  
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 58
    Points : 53
    Points
    53
    Par défaut
    Bonjour,
    j'ai essayé de tester ce code sur mon pc en prenant en considération tous ces remarques mais j'ai le même erreur:
    Exception in thread "main" java.util.ConcurrentModificationException: The ContentList supporting the FilterList this iterator is processing has been modified by something other than this Iterator.
    at org.jdom2.ContentList$FilterListIterator.checkConcurrent(ContentList.java:1337)
    at org.jdom2.ContentList$FilterListIterator.next(ContentList.java:1385)
    at org.jdom2.ContentList$FilterListIterator.next(ContentList.java:1288)
    at TraitementJdom.testJdom(TraitementJdom.java:47)
    at TraitementJdom.main(TraitementJdom.java:25)
    voici le code:
    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
     
     
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.text.Format;
    import java.util.ArrayList;
    import java.util.List;
     
    import org.jdom2.Document;
    import org.jdom2.Element;
    import org.jdom2.JDOMException;
    import org.jdom2.Parent;
    import org.jdom2.input.SAXBuilder;
    import org.jdom2.output.XMLOutputter;
     
     
    public class TraitementJdom {
     
    	static Document document;
     
    	public static  void main(String[] args) throws Exception 
    	{
     
    		Document document = TraitementJdom.testJdom("monCV.xml");		
    		enregistreFichier(document, "NEWmonCV.xml");	
    	}
     
    	public static Document testJdom(String fileName)
    	{
     
    	    XMLOutputter outp = new XMLOutputter();		
    	    Document document = null;
    	    File   file = new File(fileName);
    	    SAXBuilder builder = new SAXBuilder();
    	    try
    	    {
    	        document = builder.build(file); 
    	        Element root = document.getRootElement();	        
    	        System.out.println("<"+root.getName()+">");  // <---------------------- Début Racine	        
    	        List<Element> children = root.getChildren();	        
     
    	        for (Element c : children)	        {
    	        	System.out.println("	<"+c.getName()+">"); // <---------------------- Début Noeud		        	
    	        	List<Element> child = c.getChildren();
     
    	        	for (Element e : child)
    	        	{
     
    	        		List<Element> c2 = new ArrayList<>(e.getChildren()); // on copie la liste : on pourra la parcourir en modifiant l'original sans problème
     
    	        		if (c2.size()>0) {
     
    	        		   for (Element t   : c2) {
     
    	        		      if (t.getName().equals("diplome")) { 	        					
    	        		    	  addElementAfter(e,"mention","");  
     
    	        		      }	        				
    	        		   }	
     
    	        			System.out.println("		</"+e.getName()+">"); // <------------------ Fin Sous-Noeud
    	        		}
     
    	        		else
    	        		{ 
    	        			System.out.print("		<"+e.getName()+">");  // <------------------ Début Sous-Noeud
    	        			System.out.print(e.getText()) ; 
    	        			System.out.println("</"+e.getName()+">"); // <------------------ Fin Sous-Noeud
    	        		}
     
     
    	        	}
     
    	        	System.out.println("	</"+c.getName()+">"); // <---------------------- Fin Noeud
     
    	            //Extraire les donnees (attributes, values ...) ou parcourir en 
    	            // profondeur en fonction de child (noeud terminal ou arbre ....) 
    	        }
     
    	    System.out.println("</"+root.getName()+">");  // <---------------------- Fin Racine
     
    	    }
    	    catch (JDOMException e) 
    	    {
    	        System.err.println(e.getMessage());
    	    }
    	    catch (IOException e) 
    	    {
    	        System.err.println(e.getMessage());
    	    }
    	    return document;
     
    	}
     
     
     
     
    	// ====================================== Item ajouté ====================================== \\
     
    	private static void addElementAfter(Element element, String elementName, String textValue) {
    		Parent parent = element.getParent();
    		Element newChild = new Element(elementName);
    		newChild.setText(textValue);
    		parent.addContent(parent.indexOf(element)+1, newChild);
    	}
     
     
     
    	// ====================================== Item ajouté ====================================== \\
     
     
     
     
    	// ====================================== Sauvegarde ====================================== \\
     
    	static void enregistreFichier(Document document, String fichier) throws Exception // ajoute le paramètre document
    	   {
    	         XMLOutputter sortie = new XMLOutputter();
    	         sortie.output(document, new FileOutputStream(fichier)); // c'est le paramètre qui est utilisé et non plus la variable static
    	   }
    }
    Merci de m'aider de connaitre le source d'erreur.

  11. #11
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Tu ne peux pas modifier une liste sur laquelle tu es en train d'itérer : dès qu'on reprend l'itération après la modification, on a ce type d'exception.

    En fait, la demande est censée être "ajouter une élément mention après un élément diplome" (donc t), et non pas son parent (e).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for (Element t   : c2) {
     
         if (t.getName().equals("diplome")) { 	        					
              addElementAfter(t,"mention","");  
         }	        
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  12. #12
    Inactif  
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 58
    Points : 53
    Points
    53
    Par défaut
    Merci bien mais je trouve la balise mention en dehors de la balise diplôme.Mon but est de trouver les 2 balises imbriquées

  13. #13
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Bah, dans ce cas, il ne faut pas ajouter après mais dans (avec t.addContent( ... ).

    oar exemple en remplace addElementAfter par addElementIn :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private static void addElementIn(Element element, String elementName, String textValue) {
    		Element newChild = new Element(elementName);
    		newChild.setText(textValue);
    		element.addContent(newChild);
    	}
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  14. #14
    Inactif  
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 58
    Points : 53
    Points
    53
    Par défaut
    un grand merci

  15. #15
    Inactif  
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 58
    Points : 53
    Points
    53
    Par défaut
    Bonjour Mr Joel je suis désolée je te déranges beaucoup,j'ai un autre soucis,je veux enregistrer le contenu de mon formulaire dans un fichier Xml. Les labels seront des balises et les contenus des JTextFields seront les contenus de ces balises .L'ordre des balises est obligatoire selon l'ordre des éléments de mon formulaire.
    J'ai utilisé la méthode AddElementIn() pour ajouter le premier élément dans la première balise en xml et la methode AddElementAfter() pour ajouter le reste des éléments après la première la balise.Mais le problème c'est que si j'ajoutes un autre élément il prend la place de premier élément.
    Voici Mon fichier xml:
    <?xml version="1.0" encoding="UTF-8"?>
    <Clustering>
    <Algorithms>
    <Hierarchical />
    <Partioning />
    <Grid />
    </Algorithms>
    <Criteria>
    <InternalCrit>
    </InternalCrit>
    <ExternalCrit />
    </Criteria>
    </Clustering>
    //l'evenement

    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
    b1.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent e )
    			{
    			String value= type.getSelectedItem().toString();
    			String lbl = label.getText();
    			String name= textField.getText();
    			String label = fmain.getText();
    			switch(value)
    			{
     
    			case "Hierarchical" :
    				Document document = TraitementJdom.testJdom("file.xml",name,value,lbl);	
    				try {
    					TraitementJdom.enregistreFichier(document, "MonProjet.xml");
    				} catch (Exception e1) {
    					// TODO Auto-generated catch block
    					e1.printStackTrace();
    				}
    			Document document1 = TraitementJdom.testJdom1("file.xml",name,value,label);		
    				try {
    					TraitementJdom.enregistreFichier(document1, "MonProjet.xml");
    				} catch (Exception e1) {
    					// TODO Auto-generated catch block
    					e1.printStackTrace();
    				}
    				break;
    //Classe TraitementJdom
    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    public static class TraitementJdom {
     
    		Document document;
     
     
     
    		public static Document testJdom(String fileName, String name,String type, String lbl)
    		{
     
    		    XMLOutputter outp = new XMLOutputter();		
    		    Document document = null;
    		    File   file = new File(fileName);
    		    SAXBuilder builder = new SAXBuilder();
    		    try
    		    {
    		        document = builder.build(file); 
    		        Element root = document.getRootElement();	        
    		        System.out.println("<"+root.getName()+">");  // <---------------------- Début Racine	        
    		        List<Element> children = root.getChildren();	        
     
    		        for (Element c : children)	        {
    		        	System.out.println("	<"+c.getName()+">"); // <---------------------- Début Noeud		        	
    		        	List<Element> child = c.getChildren();
     
    		        	for (Element e : child)
    		        	{
     
    		        		List<Element> c2 = new ArrayList<>(e.getChildren()); // on copie la liste : on pourra la parcourir en modifiant l'original sans problème
     
     
    		        			     if (e.getName().equals(type)) { 	        					
    		        			    	 addElementIn(e,lbl,name);  
    		        			     }        
     
     
     
     
     
    		        		else
    		        		{ 
    		        			System.out.print("		<"+e.getName()+">");  // <------------------ Début Sous-Noeud
    		        			System.out.print(e.getText()) ; 
    		        			System.out.println("</"+e.getName()+">"); // <------------------ Fin Sous-Noeud
    		        		}
     
     
    		        	}
     
    		        	System.out.println("	</"+c.getName()+">"); // <---------------------- Fin Noeud
     
    		            //Extraire les donnees (attributes, values ...) ou parcourir en 
    		            // profondeur en fonction de child (noeud terminal ou arbre ....) 
    		        }
     
    		    System.out.println("</"+root.getName()+">");  // <---------------------- Fin Racine
     
    		    }
    		    catch (JDOMException e) 
    		    {
    		        System.err.println(e.getMessage());
    		    }
    		    catch (IOException e) 
    		    {
    		        System.err.println(e.getMessage());
    		    }
    		    return document;
     
    		}
     
     
    		public static Document testJdom1(String fileName, String name,String type, String lbl)
    		{
     
    		    XMLOutputter outp = new XMLOutputter();		
    		    Document document = null;
    		    File   file = new File(fileName);
    		    SAXBuilder builder = new SAXBuilder();
    		    try
    		    {
    		        document = builder.build(file); 
    		        Element root = document.getRootElement();	        
    		        System.out.println("<"+root.getName()+">");  // <---------------------- Début Racine	        
    		        List<Element> children = root.getChildren();	        
     
    		        for (Element c : children)	        {
    		        	System.out.println("	<"+c.getName()+">"); // <---------------------- Début Noeud		        	
    		        	List<Element> child = c.getChildren();
     
     
    		        		List<Element> c2 = new ArrayList<>(c.getChildren()); // on copie la liste : on pourra la parcourir en modifiant l'original sans problème
     
     
    		        			     if (c.getName().equals(type)) { 	        					
    		        			    	 addElementAfter(c,lbl,name);  
    		        			     }        
     
     
     
     
     
    		        		else
    		        		{ 
    		        			System.out.print("		<"+c.getName()+">");  // <------------------ Début Sous-Noeud
    		        			System.out.print(c.getText()) ; 
    		        			System.out.println("</"+c.getName()+">"); // <------------------ Fin Sous-Noeud
    		        		}
     
     
     
     
    		        	System.out.println("	</"+c.getName()+">"); // <---------------------- Fin Noeud
     
    		            //Extraire les donnees (attributes, values ...) ou parcourir en 
    		            // profondeur en fonction de child (noeud terminal ou arbre ....) 
    		        }
     
    		    System.out.println("</"+root.getName()+">");  // <---------------------- Fin Racine
     
    		    }
    		    catch (JDOMException e) 
    		    {
    		        System.err.println(e.getMessage());
    		    }
    		    catch (IOException e) 
    		    {
    		        System.err.println(e.getMessage());
    		    }
    		    return document;
     
    		}
     
     
     
    		// ====================================== Item ajouté ====================================== \\
     
    		private static  void addElementIn(Element element, String elementName, String textValue) {
    			Element newChild = new Element(elementName);
    			newChild.setText(textValue);
    			element.addContent(newChild);
     
    		}
     
    	   // ====================================== Item ajouté ====================================== \\
     
    		// ====================================== Sauvegarde ====================================== \\
     
    	 static void enregistreFichier(Document document, String fichier) throws Exception // ajoute le paramètre document
    		   {
    		         XMLOutputter sortie = new XMLOutputter();
    		         sortie.output(document, new FileOutputStream(fichier)); // c'est le paramètre qui est utilisé et non plus la variable static
    		   }
    	 private static void addElementAfter(Element element, String elementName, String textValue) {
    			Parent parent = element.getParent();
    			Element newChild = new Element(elementName);
    			newChild.setText(textValue);
    			parent.addContent(parent.indexOf(element)+1, newChild);
    		}
    	}
     
    	public class ComponentHandler {
     
    	    public final JPanel pane;
    	    public final JLabel label;
     
     
    	    public ComponentHandler(JPanel pane, JLabel label) {
    	          this.pane=pane;
    	          this.label=label;
    	             }
     
    	}
    Prière de me renseigner sur le source d'erreur

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

Discussions similaires

  1. Ajouter des noeud dans un fichier XML
    Par chinoismasque dans le forum Windows Phone
    Réponses: 4
    Dernier message: 02/08/2011, 16h32
  2. Réponses: 5
    Dernier message: 23/04/2010, 21h26
  3. Réponses: 9
    Dernier message: 18/05/2009, 08h25
  4. Ajouter des namespace dans un fichier XML
    Par Septembre84 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 19/05/2008, 12h20
  5. Comment ajouter un élément dans un fichier XML
    Par sorilazer dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 04/06/2007, 21h56

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