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

Persistance des données Java Discussion :

[Débutant(e)] Problème avec JaxB !


Sujet :

Persistance des données Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2004
    Messages : 12
    Points : 8
    Points
    8
    Par défaut [Débutant(e)] Problème avec JaxB !
    Hello !
    Je suis entrain de tester JAXB dans le cadre du boulot. Sur un fichier XML simple, c'est à dire avec un seul niveau d'info, tout va bien. Par contre si j'utilise un fichier xml un peu plus complexe avec par exemple une liste de personne, chacune definie par un nom, prénom et adresse comme cela
    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
     
    <employees xmlns="http://www.w3schools.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com 2.xsd">
     
    	<pers>
    		<firstname>Toto</firstname>
    		<lastname>Dubosi</lastname>
    		<adresse>
    			<street>Route de la foret 17</street>
    			<zip>1234</zip>
    			<city>Ici</city>
    		</adresse>
    	</pers>
    	<pers>
    		<firstname>Test</firstname>
    		<lastname>Test</lastname>
    		<adresse>
    			<street>Ici</street>
    			<zip>1234</zip>
    			<city>Iciaussi</city>
    		</adresse>
    	</pers>
    </employees>
    Je n'arrive pas à parcourir les données importées dans les objets Java. C'est une liste de personne (Vector) qu'il faut parcourir, mais je n'arrive pas à savoir de quel type est chaque objet de la liste.

    Y-a-t il qqu qui aurait deja fait ca et qui aurait un exemple ?

    Merci d'avance !

  2. #2
    Membre confirmé Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Points : 649
    Points
    649
    Par défaut
    D'apres ce que j'ai compris, ton probleme est en fait de connaitre la classe d'un objet quelconque ( Ton Vector contient des objets mais tu ne sais pas de quelle classe ils sont ) ...

    Tu peux fouiller du cote de la classe Object et voir par exemple qu'il y a une methode getClass() ... tu peux peut-etre t'en servir pour recuperer le nom de la classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TonObjet.getClass().getName()
    Tu as alors le nom, tu peux donc te debrouiller comme ca... mais il existe peut etre d'autre methode un peu plus elegante, mais je n'ai pas d'autre idee.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2004
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    En fait, en faisant un instanceof j'arrive a connaitre le nom de la classe mais elle est abstraite et je ne peux donc pas instancier d'objet de ce type. Le problème c'est que je ne trouve pas de classe créé par JAXB qui fairait un extends de cette classe et dont je pourrais instancier un objet.

    Je dois dire que je comprends pas très bien la logique de JAXB concernant la création des classes et je ne trouve pas d'exemple utilisant des fichiers xml un tant soit peu plus complexes.

  4. #4
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    essai ce schema pour generer le parseur

    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
    <?xml version="1.0" encoding="utf-16"?>
    <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
     
      <!-- noeud root "Employees" -->
      <xs:element name="employees">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="pers" minOccurs="0" maxOccurs="unbounded" type="Personne"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
     
      <!-- Les noeuds Personne -->
      <xs:complexType name="Personne">
        <xs:sequence>
          <xs:element name="firstname" type="xs:string"/>
          <xs:element name="lastname"  type="xs:string"/>
          <xs:element name="adresse"   type="Adresse"/>
        </xs:sequence>
      </xs:complexType>
     
      <!-- Les noeuds Adresse -->
      <xs:complexType name="Adresse">
         <xs:sequence>
            <xs:element name="street" type="xs:string" />
            <xs:element name="zip" type="xs:unsignedShort" />
            <xs:element name="city" type="xs:string" />
         </xs:sequence>
      </xs:complexType>
     
    </xs:schema>
    Ensuite utilise le unmarhaller pour lire ton fichier XML.
    Le unmarshaller va te renvoyer l'objet correspondant à ton noeud root.

    Sur ce noeud root tu auras la méthode getPers() qui renverra une List d'element Personne

    sur les elements "Personne" tu auras les méthodes
    - String getFirstname();
    - String getLastname();
    - Adresse getAdresse();

    et sur l'objet Adresse tu auras
    - getStreet();
    - getZip();
    - getCity();

    Pour connaitre le type du noeud root et ainsi de suite, genere la JAVADOC sur les classes de data binding générée par la compilation de ton schema XSD. La javadoc est assez clair et adapté au parseur.

    Sébastien.
    JBusyComponent, une API pour rendre occupé un composant swing.
    SCJP Java 6.0 (90% pass score)

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2004
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Merci pour cette réponse.
    C'est exactement ce que j'ai fait mais les objets de la liste sont la classe Personne qui, me dit le compilateur, est abstraite. Donc je ne peux pas instancier un objet pour récupérer le contenu de la liste. Je comprends pas très bien pourquoi c'est abstrait d'ailleurs. Voici 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
     
    JAXBContext jc = JAXBContext.newInstance( "primer.po" );
     
                Unmarshaller u = jc.createUnmarshaller();
                Employees employees = 
                    (Employees)u.unmarshal( new FileInputStream( "2.xml" ) );
     
                List liste_pers = new Vector();
                liste_pers = employees.getPers();            
     
                Personinfo obj_temp; // = new Personinfo(); //impossible car abstrait
     
                int nb = liste_pers.size();
                for(int i = 0; i < nb; i++){    	
                	System.out.println(liste_pers.get(i).getClass().getName()); //retourne Persinfo qui est mon type personnne
    	        }            
     
    	        System.out.println(nb); //fonctionne très bien
    Si tu as une idée je prends avec plaisir


    ////////////////////////////////////////////

    Je confirme: après avoir essayé ton xsd, la classe personne est abstraite, je ne peux pas instancier d'objet pour lire le contenu de la liste retournée.
    C'est là mon problème principal.

  6. #6
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Peut importe que la classe Personne soit abstraite, les objets ont été instancié par le unmarshaller en utilisant une implémentation quelquonque. pour pouvoir y acceder, il te suffit de caster les elements de ta liste dans ta classe Personne.

    De plus, si tu veux creer des objets JAXB propre a ton parseur, tu ne peut le faire directement, tu doit utiliser une usine (Factory) créée par le parseur. Elle s'appelle ObjectFactory.

    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
    JAXBContext aContext = JAXBContext.newInstance("....");
    Unmarshaller unmarshaller = aContext.createUnmarshaller();            
    Employees employees = (Employees)u.unmarshal( new FileInputStream( "...." ) );
     
    List personnes = employees.getPers();
    Iterator i = personnes.iterator();
    while(i.hasNext())
    {  Personne personne = (Personne)i.next();
        System.out.println("Personne : ");
        System.out.println(" FirstName =  " + personne.getFirstname() );
        System.out.println(" Lastname = " + personne.getLastname() );
        Adresse adresse = personne.getAdresse();
        System.out.println(" Street = " + adresse.getStreet() );
        System.out.println(" Zip = " + adresse.getZip() );
        System.out.println(" City = " + adresse.getCity() );
        System.out.println("----");
    }
    Tu n'a pas besoin d'instancier ta liste, de plus avec
    liste_pers = employees.getPers();
    tu perds quoiqu'il errive la referencesut la liste que tu as creer avec la ligne List liste_pers = new Vector();

    ton probleme ne vient pas de jaxb, mais d'un manque d'experience des collections java.

    Cordialement.

    Citation Envoyé par garulfo2
    Merci pour cette réponse.
    C'est exactement ce que j'ai fait mais les objets de la liste sont la classe Personne qui, me dit le compilateur, est abstraite. Donc je ne peux pas instancier un objet pour récupérer le contenu de la liste. Je comprends pas très bien pourquoi c'est abstrait d'ailleurs. Voici 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
     
    JAXBContext jc = JAXBContext.newInstance( "primer.po" );
     
                Unmarshaller u = jc.createUnmarshaller();
                Employees employees = 
                    (Employees)u.unmarshal( new FileInputStream( "2.xml" ) );
     
                List liste_pers = new Vector();
                liste_pers = employees.getPers();            
     
                Personinfo obj_temp; // = new Personinfo(); //impossible car abstrait
     
                int nb = liste_pers.size();
                for(int i = 0; i < nb; i++){    	
                	System.out.println(liste_pers.get(i).getClass().getName()); //retourne Persinfo qui est mon type personnne
    	        }            
     
    	        System.out.println(nb); //fonctionne très bien
    Si tu as une idée je prends avec plaisir
    JBusyComponent, une API pour rendre occupé un composant swing.
    SCJP Java 6.0 (90% pass score)

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2004
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Tu as entièrement raison !!!

    Parfait, merci ! Tout roule !

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

Discussions similaires

  1. Problème avec JAXB
    Par vince79 dans le forum Persistance des données
    Réponses: 2
    Dernier message: 14/12/2006, 11h22
  2. [débutant][servlet]Problème avec Servlet login
    Par stago dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 10/05/2005, 00h05
  3. [Ant]problème avec JAXB et XJC
    Par lili2704 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 08/12/2004, 12h00
  4. [Débutant][Phppgadmin] problème avec les types
    Par PoY dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 19/08/2004, 17h06
  5. Réponses: 5
    Dernier message: 19/08/2004, 11h11

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