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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 606
    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 : 55
    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
    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 éclairé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 606
    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 : 55
    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
    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 éclairé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 606
    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 : 55
    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
    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.

+ 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