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 :

Reconstruire un fichier XML à partir d'un autre fichier XML


Sujet :

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

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Points : 2
    Points
    2
    Par défaut Reconstruire un fichier XML à partir d'un autre fichier XML
    Bonjour,

    J'espère être dans la bonne section.

    J'ai un programme à réaliser pour l'école, un gestionnaire de contenu.
    On a dû écrire un fichier XML avec des actualités diverses avec une date pour chacune.
    Lui associer une DTD, un fichier XSL et un petit CSS, le but étant de générer une page HTML avec les actualités.

    Seconde étape, créer une classe en Java qui va charger et extraire le contenu du fichier XML mais seulement les actualités publiables le jour même d'après la date du jour.

    Tout cela est fait.

    Ensuite, on doit reconstruire un fichier XML avec uniquement les actualités publiables aujourd'hui. Ce nouveau fichier XML doit respecter la même DTD et on doit aussi lui appliquer la même XSL.

    Je n'arrive pas à réaliser cette dernière étape qui est de reconstruire un fichier XML à partir du contenu extrait d'un autre fichier XML.

    Je ne demande pas une solution toute faite, j'aimerai juste obtenir des indications ou des aides sur la marche à suivre pour terminer le programme.

    Merci d'avance

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Par exemple en utilisant JDOM :

    - créer un nouveau Document JDOM vide, avec new Document();
    - mettre l'élément racine avec new Element(); et document.setRootElement(root);
    - ajouter le contenu voulu (celui déjà extrait.)
    - Utiliser XMLOutputter pour écrire le Document formé dans un fichier XML.

    (Note : tout comme celle de Java, la JavaDoc de JDOM est très bien faite. Lire celle de Document, Element, XMLOutputter et tout ce sur quoi tu tombes.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Oui mais on doit créer une nouvelle classe ActualiteXMLWriter pour reconstruire le fichier XML.
    De plus, les actualités à afficher selon la date doivent se trouver dans un arrayList.
    Mais je ne sais pas comment mettre les actualités dans l'arrayList en question.

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par Jonvols Voir le message
    Oui mais on doit créer une nouvelle classe ActualiteXMLWriter pour reconstruire le fichier XML.
    Fais-le, où est le problème ?

    Citation Envoyé par Jonvols Voir le message
    De plus, les actualités à afficher selon la date doivent se trouver dans un arrayList.
    Mais je ne sais pas comment mettre les actualités dans l'arrayList en question.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    List<ClasseDeLActualite> actualites = new ArrayList<ClasseDeLActualite>();
     
    while(ilYAEncoreDesActualites()) {
      actualites.add(choperLActualiteSuivante());
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Le problème est que je ne sais pas ce que je dois mettre dans cette classe justement

  6. #6
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Citation Envoyé par Jonvols Voir le message
    Le problème est que je ne sais pas ce que je dois mettre dans cette classe justement
    Si tu as réussi à faire la premiere partie, la seconde ne devrait pas te bloqué.
    Pour construire le second fichier avec les actualité à publier, il te suffit dans un premier temps de récupérer ces informations et les stocker dans une liste. Ensuite, une autre méthode peut se charger de créer le nouveau XML à partir des informations que tu as préalablement obtenues. Disposons du XML tu peux lm'enregistrer dans un fichier et effectuer d'autres s'il y en a.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Bizarrement, ça me parait compliqué même en ayant fait la première partie...
    J'ai essayé de mettre les actualités dans un arrayList mais je ne sais pas à quel endroit le mettre exactement. J'ai essayé mais plein d'erreur après...

    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
    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
    123
    124
    125
    126
     
    package xml;
     
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
     
    /**
     *
     * @author Jonathan
     */
    public class ArticleContentHandler extends DefaultHandler {
     
        private boolean debutArticle;
        private boolean debutNom;
        private boolean debutTitre;
        private boolean debutContenu;
        private boolean debutDateCreation;
        private boolean debutDatePublication;
        private boolean debutDureePublication;
        private Article article;
        private List<Article> liste = new ArrayList<Article>();
     
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
     
            if (qName.equals("article")) {
                debutArticle = true;
                article = new Article();
            }
            if (qName.equals("nom") && debutArticle) {
                debutNom = true;
            }
            if (qName.equals("titre") && debutArticle) {
                debutTitre = true;
            }
            if (qName.equals("contenu") && debutArticle) {
                debutContenu = true;
            }
            if (qName.equals("dateCreation") && debutArticle) {
                debutDateCreation = true;
            }
            if (qName.equals("datePublication") && debutArticle) {
                debutDatePublication = true;
            }
            if (qName.equals("dureePublication") && debutArticle) {
                debutDureePublication = true;
            }
     
        }
     
        public void characters(char[] ch, int start, int length) throws SAXException {
            String lecture = new String(ch, start, length);
            SimpleDateFormat dateStandard = new SimpleDateFormat("dd/MM/yyyy");
     
            if (debutNom && debutArticle) {
                article.setNom(lecture);
                System.out.println(article.getNom());
            }
            if (debutTitre && debutArticle) {
                article.setTitre(lecture);
                System.out.println(article.getTitre());
            }
            if (debutContenu && debutArticle) {
                article.setContenu(lecture);
                System.out.println(article.getContenu());
            }
            if (debutDateCreation && debutArticle) {
                try {
                    article.setDateCreation(dateStandard.parse(lecture));
                    System.out.println(dateStandard.format(article.getDateCreation()));
                } catch (ParseException ex) {
                    Logger.getLogger(ArticleContentHandler.class.getName()).log(Level.SEVERE, null, ex);
                }   
            }
            if (debutDatePublication) {
                try {
                    article.setDatePublication(dateStandard.parse(lecture));
                    System.out.println(dateStandard.format(article.getDatePublication()));
                } catch (ParseException ex) {
                    Logger.getLogger(ArticleContentHandler.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            if (debutDureePublication && debutArticle) {
     
            }
     
     
        }
     
        public void endElement(String uri, String localName, String qName) throws SAXException {
            if (qName.equals("article")) {
                debutArticle = false;
            }
            if (qName.equals("nom") && debutArticle) {
                debutNom = false;
            }
            if (qName.equals("titre") && debutArticle) {
                debutTitre = false;
            }
            if (qName.equals("contenu") && debutArticle) {
                debutContenu = false;
            }
            if (qName.equals("dateCreation") && debutArticle) {
                debutDateCreation = false;
            }
            if (qName.equals("datePublication") && debutArticle) {
                debutDatePublication = false;
            }
            if (qName.equals("dureePublication") && debutArticle) {
                debutDureePublication = false;
            }
            while(debutArticle){
                liste.add(article);
            }
            if(liste.isEmpty())
                System.out.println("Pas ok");
     
     
        }
    }

  8. #8
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Quelles Exceptions as tu exactement?
    Pourrais tu fournir un exemple de fichier XML que tu essaies de charger?

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Donc voici le fichier XML à charger dans ma classe Java juste avant.
    Je ne vous montre que 2 article sinon ça fait beaucoup.
    Un fois chargé dans la classe, j'aimerais juste les encoder dans un ArrayList mais je n'y arrive pas. Si je dois faire une boucle, je dois mettre quoi comme condition d'arrêt?
    Dans l'exemple qu'on m'a donné ici, il passe une méthode comme condition..
    Je n'ai pas de telle méthode.
    Je ne sais pas dans quelle partie de ma classe je dois mettre mon ArrayList...

    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
      <?xml version="1.0" encoding="UTF-8" ?> 
      <!DOCTYPE gestion (View Source for full doctype...)> 
    - <!--     Document   : newXMLDocument.xml
        Created on : 20 octobre 2010, 15:27
        Author     : Jonathan
        Description:
            Purpose of the document follows.
     
      --> 
    - <gestion>
     
    - <article id="MCTF3">
      <nom>Un_composite_se_comporte_comme_un_capteur</nom> 
      <titre>Un composite se comporte comme un capteur</titre> 
      <contenu>Ce sandwich métal-plastique sait donner un état des contraintes mécaniques qu'il subit. Pas besoin d’ajouter des capteurs d’effort pour surveiller le nouveau matériau imaginé à l’Institut allemand Fraunhofer : ce composite plastique-métal assure la fonction tout seul. Les chercheurs, sous la direction du physico-chimiste Arne Haberkorn, ont imaginé un procédé capable d’intégrer un polymère classique (polypropylène, polyamide) à n’importe quel type de métal, de façon à obtenir des pièces mécaniques dont les caractéristiques électriques changent en fonction des contraintes mécaniques appliquées. L’intérêt ? Obtenir un état du matériau dans sa masse, et non de façon localisée à l’aide des capteurs classiques. Ces matériaux permettraient par exemple de surveiller en permanence les efforts subis par des pales d’éolienne, des pièces de machines outils ou des voilures d’avion pour anticiper et faciliter la maintenance. Atouts non négligeables, les composites ainsi fabriqués sont légers et peuvent être produits en grande quantité à l’aide de procédés existants.</contenu> 
      <dateCreation>19/10/2010</dateCreation> 
      <datePublication>19/10/2010</datePublication> 
      <dureePublication format="jour">60</dureePublication> 
      </article>
    - <article id="MCTF4">
      <nom>Une_simple_vitre_devient_enceinte_hifi</nom> 
      <titre>Une simple vitre devient enceinte hifi</titre> 
      <contenu>La base de l'enceinte produit le son en faisant vibrer la lame de verre. Invisibles, pas tout à fait, mais spectaculaires, c’est certain : les enceintes sonores inventées par la société américaine Greensound Technology se composent tout simplement d’une lame de verre. C’est la vibration de la vitre, générée par un générateur de son placé dans la base de l’enceinte, qui produit le son. La découpe du verre ne répond pas seulement aux exigences du design : chaque zone de la lame est chargée d’émettre dans une fréquence particulière, comme les différents haut-parleurs d’une enceinte classique. Ainsi, la zone recourbée gère les aigus, les basses étant produits près de la base. La limite de la technologie réside dans l’encombrement : avec 124,5 cm de haut et 36 kg pour 25 W, l’enceinte Floe (ci-dessus) ne passe pas tout à fait inaperçue dans le salon, même en version sans fil. La gamme est déclinée en plusieurs modèles et comprend même des caissons dédiés aux basses fréquences. Greensound va commercialiser ses produits incessamment aux Etats-Unis, mais n’a pas encore communiqué ses tarifs.</contenu> 
      <dateCreation>14/09/2010</dateCreation> 
      <datePublication>15/09/2010</datePublication> 
      <dureePublication format="jour">35</dureePublication> 
      </article>
     
      </gestion>

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Tu aurais pu simplifier le problème au début : t'occuper juste du nom de l'article, et le reste tu l'aurais ajouté tout seul plus tard.

    Un fois chargé dans la classe, j'aimerais juste les encoder dans un ArrayList mais je n'y arrive pas. Si je dois faire une boucle, je dois mettre quoi comme condition d'arrêt?
    Dans l'exemple qu'on m'a donné ici, il passe une méthode comme condition..
    Je n'ai pas de telle méthode.
    Je ne sais pas dans quelle partie de ma classe je dois mettre mon ArrayList...
    Si tu parses le fichier en SAX, le parcours de SAX est déjà une boucle. Tu n'as pas besoin d'en faire une autre.

    Ton ArrayList<Article> est très bien là où elle est.
    Le add(), tu peux le faire à chaque fois que tu as produit un article. Ça peut être juste après avoir fait new Article(), ou alors sur le endElement() qui ferme l'article en cours. Comme tu veux, c'est pareil.

    En l'état elle ne sert pas à grand-chose, par contre, puisque personne ne peut récupérer la liste quand le parsing est fini. Tu devrais ajouter un getListe() à ton contentHandler.


    Pour ce qui est d'écrire un fichier XML avec le résultat obtenu, c'est tout autre chose. Déjà, je conseille pas de le faire avec SAX, c'est chiant et mal documenté. Regarde plutôt du côté de JDOM.
    Ensuite, il faut que ça soit fait après que le parsing soit fini, une fois que tu as récupéré la List<Article> terminée de ton contentHandler.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Désolé mais je ne fais que suivre les consignes du prof.

    On doit le faire avec SAX :s

    J'ai mis le add comme tu as dit et j'ai fait le test isEmpty pour voir si la liste contient bien quelque chose.
    J'ai affiché ce que j'avais dans ma ArrayList mais le contenu est trop grand, il le prend pas en entier. Pour ce qui est des titres et dates, c'est parfait.


    Mais je ne comprend pas, le getList(), il va me servir à quoi?


    Merci déjà, ça m'aura déjà permis d'avancer

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par Jonvols Voir le message
    Mais je ne comprend pas, le getList(), il va me servir à quoi?
    Bah, c'est simple. Une fois que tu as construit ton ArrayList, tu vas en faire quoi ?

    Je suppose que tu vas vouloir t'en servir ailleurs, genre par exemple, dans la classe qui a appelé le parseur SAX.
    Et comment elle va faire pour récupérer cette ArrayList ? C'est une variable privée. Il faut donc un accesseur pour récupérer cette ArrayList après qu'elle ait été construite.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Juste, j'avais pas pensé à ça

    Je ne vais pas la récupérer dans la classe où il y a le parseur, c'est la classe main.
    Je dois créer un nouveau fichier XML à partir de cet ArrayList dans une nouvelle classe qu'on devra appeler ActualiteXMLWriter.
    Ensuite, associé la XSL du premier fichier XML au nouveau fichier.
    Mais je l'avais déjà

Discussions similaires

  1. [Débutant] Exécution d'un fichier MATLAB à partir d'un autre fichier
    Par abdouccu dans le forum MATLAB
    Réponses: 2
    Dernier message: 07/06/2012, 20h42
  2. Réponses: 5
    Dernier message: 23/03/2009, 16h36
  3. Réponses: 1
    Dernier message: 23/09/2006, 14h12
  4. [FPDF] Créer un fichier PDF à partir d'un autre fichier PDF
    Par axel-erator dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 18/06/2006, 23h29
  5. [VBA-E]Génération de fichiers Excel à partir d'un autre
    Par cyrille2k5 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/05/2006, 10h27

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