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 :

[Conception] XML vers BDD [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é
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 96
    Par défaut [Conception] XML vers BDD
    Bonjour,

    J'ai un fichier XML de la forme :
    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
     
    <Rapport>
    	<Entete>
    		<Champ1></Champ1>
    		<Champ2></Champ2>
    ...
    		<ChampX></ChampX>
    	</Entete>
     
    	<Test>
    		<Champ10></Champ10>
    		<Champ11></Champ11>
    ...
    		<Champ1X></Champ1X>
    	</Test>
     
    	<Test>
    		<Champ10></Champ10>
    		<Champ11></Champ11>
    ...
    		<Champ1X></Champ1X>
    	</Test>
    </Rapport>
    Où un rapport est composé d'une Entete et de 0 ou X Test.

    Je dois transférer ces données vers une BDD MySQL qui a un table Entete et une table Test.
    Ma question est la suivante : quelle est la "meilleure" méthode pour faire ce genre de chose ?

    J'ai fait :
    • une classe Rapport qui me permet de parcourir mon fichier XML (avec JDOM) qui a comme attributs Champ1, Champ2,... ChampX, Champ10, Champ20,... Champ1X
    • une classe Entete qui a comme attributs Champ1, Champ2,... ChampX
    • une classe Test qui a comme attributs Champ10, Champ20,... Champ1X

    Ca fonctionne mais l'organisation ne me semble pas des plus joyeuse (répétition des attributs entre la classe Rapport et les classe Entete et Test.

    Je suis preneur de tout conseil


    S. Combes

  2. #2
    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
    A priori il me semblerait plus logique que la classe Rapport contienne un Entete et un List<Test>.

    Mais on ne sait pas précisément quelle API tu utilises pour insérer en BDD, on ne sait donc pas au juste de quoi tu as besoin.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 96
    Par défaut
    Merci thelvin, c'est effectivement vers cette organisation que je me dirigeais aussi

    Pour insérer mes éléments à ma BDD (MySQL) je pense utiliser JDBC.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Par défaut
    Hello,
    Il y a aussi des outils (ETL) dédiés à ce genre d'opérations. http://scriptella.javaforge.com/ par exemple
    Je l'ai pas creusé, mais il y a des exemples fournis de manipulation XML. Sinon, il y a Talend aussi, mais c'est un peu la grosse artillerie.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 33
    Par défaut
    Juste pour la transcription des XML vers des objets Java, tu peux aussi utiliser JaxB.
    C'est beaucoup plus simple à écrire et à utiliser.

    Voici, par exemple, une classe avec des anotations JaxB :
    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
     
    @XmlRootElement(name = "BundleProperties")
    public class InjectionBundleProperties {
     
        private String version         = null;
        private String index           = null;
        private String description     = null;
        private String numberOfPage    = null;
        private Date   created         = null;
        private String creator         = null;
        private String dataLoadVersion = null;
     
        /**
         * Empty constructor for jaxB.
         */
        public InjectionBundleProperties() {
        }
     
        /**
         * @return a String : The description of the Content
         */
        @XmlElement
        public final String getDescription() {
            return this.description;
        }
     
        /**
         * @param newDescription a String : The description of the Content
         */
        public final void setDescription(final String newDescription) {
            this.description = newDescription;
        }
     
        /**
         * @return a String : The version of the content
         */
        @XmlAttribute
        public final String getVersion() {
            return this.version;
        }
     
        /**
         * @param newVersion a String : The version of the content
         */
        public final void setVersion(final String newVersion) {
            this.version = newVersion;
        }
     
        /**
         * @return the nbPage
         */
        @XmlAttribute
        public final String getNumberOfPage() {
            return this.numberOfPage;
        }
     
        /**
         * @param newNumberOfPage the numberOfPage to set
         */
        public final void setNumberOfPage(final String newNumberOfPage) {
            this.numberOfPage = newNumberOfPage;
        }
     
        /**
         * @return the index
         */
        @XmlAttribute
        public final String getIndex() {
            return this.index;
        }
     
        /**
         * @param newIndex the index to set
         */
        public final void setIndex(final String newIndex) {
            this.index = newIndex;
        }
     
        /**
         * @return the created
         */
        @XmlAttribute
        public final Date getCreated() {
            return this.created;
        }
     
        /**
         * @param dateCreated the created to set
         */
        public final void setCreated(final Date dateCreated) {
            this.created = dateCreated;
        }
     
        /**
         * @return the creator
         */
        @XmlAttribute
        public final String getCreator() {
            return this.creator;
        }
     
        /**
         * @param newCreator the creator to set
         */
        public final void setCreator(final String newCreator) {
            this.creator = newCreator;
        }
     
        /**
         * @return the dataLoadVersion
         */
        @XmlAttribute
        public final String getDataLoadVersion() {
            return this.dataLoadVersion;
        }
     
        /**
         * @param newVersion the dataLoadVersion to set
         */
        public final void setDataLoadVersion(final String newVersion) {
            this.dataLoadVersion = newVersion;
        }
    Les Impératifs Jaxb sont
    • Un constructeur sans argument
    • Des anotations "@Xmlxxx" sur la classe et les getters

    Limite : Jaxb ne sait pas gérer les interfaces. Il ne faut pas donc qu'il y en ait dans l'arbre d'héritage de ta classe.

    Le fichier XML correspondant à l'une des instances de cette classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <BundleProperties version="02" numberOfPage="1" index="0" dataLoadVersion="3.0.0.5" creator="root" created="2010-10-13T14:20:00.054+02:00">
        <description>Description Magnifique.</description>
    </BundleProperties>
    Pour passer de l'objet au 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
     
        /**
         * Reads bundle properties from given XML file.
         * 
         * @param inFile xml file that contains bundle properties.
         * @return read properties.
         * @throws Exception in case of unmarshalling error.
         */
        public static InjectionBundleProperties readBundlePropertiesFromFile(final java.io.File inFile)
                throws Exception {
            final JAXBContext j = JAXBContext.newInstance(new Class[] { InjectionBundleProperties.class });
            final Unmarshaller u = j.createUnmarshaller();
            return (InjectionBundleProperties) u.unmarshal(inFile);
        }
    Pour passer du XML à l'objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        /**
         * Reads bundle properties from given XML file.
         * 
         * @param inFile xml file that contains bundle properties.
         * @return read properties.
         * @throws Exception in case of unmarshalling error.
         */
        public static InjectionBundleProperties readBundlePropertiesFromFile(final java.io.File inFile)
                throws Exception {
            final JAXBContext j = JAXBContext.newInstance(new Class[] { InjectionBundleProperties.class });
            final Unmarshaller u = j.createUnmarshaller();
            return (InjectionBundleProperties) u.unmarshal(inFile);
        }
    A savoir que JaxB gère très bien les List, Map ou autres Array...

    En faisant quelques essais, tu devrait pouvoir trouver une structure de classe qui, passée par la moulinette jaxB te donne exactement un XML tel que ceux que tu gères.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Par défaut
    Et pourquoi pas un XSL-T tout simple qui te génère le script SQL d'import.

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

Discussions similaires

  1. [Mysql] Donnée XML >vers> BDD
    Par largiss dans le forum XQUERY/SGBD
    Réponses: 14
    Dernier message: 28/02/2017, 17h51
  2. Réponses: 6
    Dernier message: 25/03/2015, 17h30
  3. Problème d'encodage XML vers BDD
    Par ciolvic dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 18/12/2012, 14h03
  4. XML vers BDD - meilleure méthode
    Par jmmalain dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 21/08/2010, 01h06
  5. [XML][MYSQL] Importation données XML vers BDD MySql
    Par Ben-o dans le forum XQUERY/SGBD
    Réponses: 2
    Dernier message: 04/05/2006, 18h13

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