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 :

Plusieurs fois le même noeud dans un fichier XML [JAXB]


Sujet :

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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2012
    Messages : 24
    Par défaut Plusieurs fois le même noeud dans un fichier XML
    Bonjour !

    Je fais mes premiers pas avec JABX, et je me demande comment ajouter dans mon xml plusieurs fois les même noeuds.

    Pour être plus précis (il y a beaucoup de code mais c'est simple ) :

    J'ai un objet FilmXml qui peut être présent plusieurs fois dans mon fichier XML comme ceci :

    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
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <filmXml xmlns="http://www.ndd.com/jaxb">
      <emplacementFichier></emplacementFichier>
      <nomFichier>fichier1.avi</nomFichier>
      <identifiant>1</identifiant>
      <nom>Nom du premier Film</nom>
      <annee>2000</annee>
    </filmXml>
    <filmXml xmlns="http://www.ndd.com/jaxb">
      <emplacementFichier></emplacementFichier>
      <nomFichier>fichier2.avi</nomFichier>
      <identifiant>2</identifiant>
      <nom>Nom du deuxième film</nom>
      <annee>2010</annee>
    </filmXml>
    Le problème est que seul mon dernier objet est ajouté à mon fichier XML !

    Voiçi mon 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
     
    /**
             * Liste des films 
             * @param lstFilmFichier liste des films qui sont présent physiquement sur le disque
             */
    	public static void genererListeXmlScan(ArrayList<Film> lstFilmFichier) {
     
     
    		//Parcours des films présents physiquement sur le disque pour en faire un xml (1ere fois)
    		System.out.println("-- Début génération fichier.xlm --");
    		File fichierXml = new File(Constantes.DOSSIER_BASE+"/"+Constantes.FICHIER_FILMS_XML);
     
     
    		//On travail directement avec des objets structurés pour le xml :
    		ArrayList<FilmXml> lstFilmXml = obtenirListeFilmXml(lstFilmFichier);	
     
    		try {
    			JAXBContext jc = JAXBContext.newInstance(FilmXml.class);				
     
    			for(FilmXml filmXml : lstFilmXml) {	
    				Marshaller marshaller = jc.createMarshaller();
    				marshaller.marshal(filmXml, fichierXml);
    			}
    		} catch (JAXBException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
    		System.out.println("-- Fin génération fichier.xml --");
    	}
     
     
    	//Mettre nos objets film en objet film xml utilisable avec JAXB:
    	private static ArrayList<FilmXml> obtenirListeFilmXml(ArrayList<Film> lstFilmFichier) {
    		ArrayList<FilmXml> lstFilmXml = new ArrayList<FilmXml>();		
     
    		for(Film film : lstFilmFichier) {	
    			ObjectFactory fabrique = new ObjectFactory();
    			FilmXml filmXml = fabrique.createFilmXml();
    			filmXml.setEmplacementFichier(film.getEmplacementFichier());
    			filmXml.setNomFichier(film.getNomFichier());
    			filmXml.setAnnee(0);			
    			filmXml.setIdentifiant("");
    			filmXml.setNom("");
     
    			lstFilmXml.add(filmXml);
     
    		}		
    		return lstFilmXml;
     
    	}

    D'ou ma question : comment ajouter plusieurs fois le même noeud dans mon fichier XML ? / Pourquoi uniquement le dernier objet est ajouté dans mon fichier XML ?

    Merci

  2. #2
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    je ne connais pas JAXB, mais en consultant la doc pour marshal, je vois
    Marshal the content tree rooted at jaxbElement into a file.

    Parameters:
    jaxbElement - The root of content tree to be marshalled.
    output - File to be written. If this file already exists, it will be overwritten.
    je pense que ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(FilmXml filmXml : lstFilmXml) {	
      Marshaller marshaller = jc.createMarshaller();
      marshaller.marshal(filmXml, fichierXml);
    }
    réécrit le fichier pour chaque élément.

    en fait ta liste de films est composée d'éléments distincts, il te faut les lier dans un document commun avant d'imprimer le tout en une fois

    bon courage !

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    J'ajoute qu'un fichier XML n'a qu'un seul élément racine.
    On peut donc douter du fait que JAXB (ou quoi que ce soit d'autre) accepte d'en écrire deux.

    (Sauf s'il gère l'écriture de fragments XML, qui ne sont pas des documents xml et n'en ont généralement pas l'extension.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2012
    Messages : 24
    Par défaut
    J'ajoute qu'un fichier XML n'a qu'un seul élément racine.
    On peut donc douter du fait que JAXB (ou quoi que ce soit d'autre) accepte d'en écrire deux.
    En effet, j'ai modifié mon xml pour qu'il ai une seule racine, j'obtiens :
    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
     
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <bibliothequeXml xmlns="http://www.monappli.com/jaxb">
    <filmXml>
      <emplacementFichier></emplacementFichier>
      <nomFichier>fichier1.avi</nomFichier>
      <identifiant>1</identifiant>
      <nom>Nom du premier Film</nom>
      <annee>2000</annee>
    </filmXml>
    <filmXml>
      <emplacementFichier></emplacementFichier>
      <nomFichier>fichier2.avi</nomFichier>
      <identifiant>2</identifiant>
      <nom>Nom du deuxième film</nom>
      <annee>2010</annee>
    </filmXml>
    </bibliothequeXml>

    Et deuxième chose, j'ai modifié mon schéma Xml sur l'élément filmXml en ajoutant : Pour finir j'utilise le code suivant pour générer mon 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
    /**
             * Liste des films 
             * @param lstFilmFichier liste des films qui sont présent physiquement sur le disque
             */
    	public static void genererListeXmlScan(ArrayList<Film> lstFilmFichier) {		
     
    		//Parcours des films présents physiquement sur le disque pour en faire un xml (1ere fois)
    		System.out.println("-- Début génération fichier.xlm --");
    		File fichierXml = new File(Constantes.DOSSIER_BASE+"/"+Constantes.FICHIER_FILMS_XML);	
     
    		//On travail directement avec des objets structurés pour le xml :
    		BibliothequeXml bibliothequeXml = obtenirBibliothequeXml(lstFilmFichier);
     
    		try {	
    			JAXBContext jc = JAXBContext.newInstance(BibliothequeXml.class);				
    			Marshaller marshaller = jc.createMarshaller();
    			marshaller.marshal(bibliothequeXml, fichierXml);		
    		} catch (Exception e) {
    			e.printStackTrace();
    		}		
    		System.out.println("-- Fin génération fichier.xml --");
    	}
     
     
    	//Mettre nos objets film en objet film xml :
    	private static BibliothequeXml obtenirBibliothequeXml(ArrayList<Film> lstFilmFichier) {
     
    		ObjectFactory fabrique = new ObjectFactory();
    		BibliothequeXml bibliothequeXml = fabrique.createBibliothequeXml();	
     
    		for(Film film : lstFilmFichier) {	
     
    			BibliothequeXml.FilmXml filmXml = fabrique.createBibliothequeXmlFilmXml();			
    			filmXml.setEmplacementFichier(film.getEmplacementFichier());
    			filmXml.setNomFichier(film.getNomFichier());
    			filmXml.setAnnee(0);			
    			filmXml.setIdentifiant("");
    			filmXml.setNom("");
    			bibliothequeXml.getFilmXml().add(filmXml);
    		}		
    		return bibliothequeXml;
     
    	}
    -> Ici on voit que je passe maintenant par l'objet BibliothequeXml qui comprend une List de FilmXml.

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

Discussions similaires

  1. [AC-2003] Access Copie 2 fois la même colonne dans un fichier Excel
    Par rch05 dans le forum VBA Access
    Réponses: 2
    Dernier message: 15/11/2010, 10h49
  2. Réponses: 2
    Dernier message: 12/01/2010, 12h00
  3. Réponses: 7
    Dernier message: 30/10/2008, 11h31
  4. Plusieurs fois la même donnée dans une liste
    Par BRUNO71 dans le forum IHM
    Réponses: 3
    Dernier message: 21/01/2008, 08h22
  5. Plusieurs fois le même .class dans le jar
    Par kenny6 dans le forum Général Java
    Réponses: 7
    Dernier message: 25/04/2007, 16h42

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