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 :

HashMap avec JaxB


Sujet :

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

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3
    Points : 4
    Points
    4
    Par défaut HashMap avec JaxB
    Bonjour à tous,
    je suis en train de découvrir le monde merveilleux de JaxB, malheureusement je but sur un point.
    Je dois à partir de schémas XSD, qui me sont fournis, générer des classes Java qui vont me permettre de faire mon marshalling et unmarshalling (jusque-là sans problème) sur des fichiers XML qui me sont fournis.
    Le seul problème est que j'aimerais "unmarshaller" dans une HashMap au lieu d'une List (implémentation de base quand j'effectue la commande XJC sur mon schéma), avec comme clé un des éléments (l'id de l'objet) et valeur l'objet.
    Par ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <enfants> 
       <enfant>
          <id>1</id>
          <nom>Doe</nom>
          <prenom>John</prenom>
       </enfant>
       <enfant>
          <id>2</id>
          <nom>Doe</nom>
          <prenom>Jane</prenom>
       </enfant>
    </enfants>
    et ainsi créer une map avec comme clé le contenu de l'élément id et comme valeur un objet représentant enfant.
    J'ai regardé et j'ai trouvé l'xmlAdapter : http://download.oracle.com/javase/6/...mlAdapter.html malheureusement, je ne dois nullement modifié l'XML qui m'est transmis.
    Auriez-vous une(des) idée(s), solutions?
    Merci d'avance

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2009
    Messages : 54
    Points : 60
    Points
    60
    Par défaut J'ai eu le meme problème
    j'ai cherché une solution et je l'ai trouvé sur le net et avec ce code vous aller pouvoir l'adapter a votre situation

    -Start----Une classe Root.java-----
    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
    import java.util.HashMap;
    import java.util.Map;
     
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.adapters.XmlAdapter;
    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
     
     
    @XmlRootElement
    public class Root
    {
      private String name;
      private int    junk;
      private String surname;
     
      @XmlJavaTypeAdapter(MapAdapter.class)
      private Map<String, Boolean> lights;
     
      public Root()
      {
        name = "";
        junk = 0;
        lights = new HashMap<String, Boolean>();
        surname = "";
      }
     
      public void   setName(String newName)  { name = newName; }
      public String getName()                { return name; }
     
      public void setJunk(int newJunk)  { junk = newJunk; }
      public int  getJunk()             { return junk; }
     
     
     
      public String getSurname() {
    	return surname;
    }
     
    public void setSurname(String surname) {
    	this.surname = surname;
    }
     
    public void turnLightOn(String lightName)   { lights.put(lightName, true); }
      public void turnLightOff(String lightName)  { lights.put(lightName, false); }
    }
     
    class MapAdapter extends XmlAdapter<MapElements[], Map<String, Boolean>>
    {
      public MapElements[] marshal(Map<String, Boolean> arg0) throws Exception
      {
        MapElements[] mapElements = new MapElements[arg0.size()];
     
        int i = 0;
        for (Map.Entry<String, Boolean> entry : arg0.entrySet())
          mapElements[i++] = new MapElements(entry.getKey(), entry.getValue());
     
        return mapElements;
      }
     
      public Map<String, Boolean> unmarshal(MapElements[] arg0) throws Exception
      {
        Map<String,Boolean> r = new HashMap<String,Boolean>();
        for(MapElements mapelement : arg0)
          r.put(mapelement.key, mapelement.value);
        return r;
      }
    }
     
    class MapElements
    {
      @XmlElement public String  key;
      @XmlElement public Boolean value;
     
      private MapElements() {} //Required by JAXB
     
      public MapElements(String key, Boolean value)
      {
        this.key   = key;
        this.value = value;
      }
    }

    Seconde Class

    ---Start la class Program ----
    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
    import java.io.File;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.PrintWriter;
    import java.io.Reader;
    import java.io.Writer;
     
    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.Marshaller;
    import javax.xml.bind.Unmarshaller;
    import javax.xml.stream.XMLInputFactory;
    import javax.xml.stream.XMLStreamReader;
     
     
    public class Program
    {
      private static void writeAsXml(Object o, Writer writer) throws Exception
      {
        JAXBContext jaxb = JAXBContext.newInstance(o.getClass());
     
        Marshaller xmlConverter = jaxb.createMarshaller();
        xmlConverter.setProperty("jaxb.formatted.output", true);
        xmlConverter.marshal(o, writer);
      }
     
      private static <T> T readObjectAsXmlFrom(Reader reader, Class<T> c) throws Exception
      {
        JAXBContext jaxb = JAXBContext.newInstance(c);
     
        XMLStreamReader xmlReader =
          XMLInputFactory.newInstance().createXMLStreamReader(reader);
     
        Unmarshaller xmlInterpreter = jaxb.createUnmarshaller();
     
        return xmlInterpreter.unmarshal(xmlReader, c).getValue();
      }
     
      public static void main(String... args) throws Exception
      {
        Root root = new Root();
        //Root2 root = new Root2();
     
        root.setName("My House");
        root.setSurname("Gaetan Guelette");
        root.setJunk((int)(Math.random() * 98.0 + 1));
        root.turnLightOn("kitchen");
        root.turnLightOff("bathroom");
        root.turnLightOn("backyard");
        root.turnLightOff("Gaetan");
        root.turnLightOn("Laurence");
        root.setName("ggutest");
        root.setJunk((int)(20));
     
        File xmlFile = File.createTempFile("raagsMap", ".xml");    
        writeAsXml(root, new FileWriter(xmlFile));
        writeAsXml(root, new PrintWriter(System.out));
     
        System.out.println();
     
        Root copy = readObjectAsXmlFrom(new FileReader(xmlFile.getAbsolutePath()), root.getClass());
        //Root2 copy = readObjectAsXmlFrom(new FileReader(xmlFile.getAbsolutePath()), root.getClass());
        copy.setName("Copy of " + root.getName());
        writeAsXml(copy, new PrintWriter(System.out));
      }
    }
    Vous aller trouvé le fichier dans le directory Temp de votre
    comme je vous le dit j'ai cherché une solution a ce problème mais je ne parviens plus a retrouver l'url sur le web mais ce code répondra a votre problématique.


    Bien à vous

    Gaetan.G

Discussions similaires

  1. parsing avec jaxb
    Par slimtun dans le forum Persistance des données
    Réponses: 3
    Dernier message: 11/02/2008, 16h50
  2. probleme avec jaxb
    Par felix79 dans le forum Persistance des données
    Réponses: 1
    Dernier message: 04/04/2007, 23h02
  3. Problème avec JAXB
    Par vince79 dans le forum Persistance des données
    Réponses: 2
    Dernier message: 14/12/2006, 11h22
  4. [Débutant(e)] Problème avec JaxB !
    Par garulfo2 dans le forum Persistance des données
    Réponses: 6
    Dernier message: 08/02/2005, 09h28
  5. [Ant]problème avec JAXB et XJC
    Par lili2704 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 08/12/2004, 12h00

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