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 :

Lire transformer et enregistrer un fichier xml avec java


Sujet :

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

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 217
    Points : 218
    Points
    218
    Par défaut Lire transformer et enregistrer un fichier xml avec java
    Bonjour à tous,
    j'ai vu que le sujet avait été traité deux fois sur le forum il y a un certain temps, mais aucune fois il n'y a eu d’explications sur la solution que la personne avait soi disant trouvé.
    Du coup je vais reproposer le problème car j'aimerais savoir comment résoudre ce cas de figure.

    Alors nous avons un fichier texte avec: (achats.txt)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Jean Charles, 3214324565, 321, 2
     Yvan Richard, 5435435545, 321, 1
     Yvette Gagnon, 4324324243, 1, 12
    Ensuite un code xml: (inventaire.xml)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
     <inventaire>
     <produit code="1" prix="432.00" quantité= "43" />
     <produit code="32" prix="32.00" quantité= "100"  />
     <produit code="321" prix="31.00" quantité= "200"  />
     </inventaire>
    Mon code source devra se trouver dans le fichier « Inventaire.java » et la commande « java Inventaire achats.txt inventaire.xml» va modifier le fichier « inventaire » pour y soustraire les produits achetés ce qui, dans le cas qui nous concerne, donnera un fichier « inventaire.xml » ayant le contenu suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
     <inventaire>
     <produit code="1" prix="432.00" quantité= "31" />
     <produit code="32" prix="32.00" quantité= "100"  />
     <produit code="321" prix="31.00" quantité= "197"  />
     </inventaire>
    Apparemment il est possible d'écrire un tel programme en moins de 50 lignes.

    Voici quelque petites règles supplémentaire:

    Nous pouvons supposer que le fichier « inventaire.xml » ne contient qu'un seul élément « produit » pour chaque valeur d'attribut « code ». Nous pouvons aussi supposer qu'aucun code invalide n'apparaît dans le fichier « achats.txt ». Par contre, nous ne savons pas combien de produits nous avons et combien d'achats il y aura. Évidemment, il est possible d'avoir un nombre négatif de produits dans notre inventaire.

    Alors je vais commencer étape par étape donc le début sera :
    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
     
    import org.w3c.dom.*;
     import java.io.*;
     import javax.xml.parsers.*;
     import javax.xml.transform.*;
     import javax.xml.transform.dom.*;
     import javax.xml.transform.stream.*;
     
     public class inventaire {
        public static void main(String[] args) throws Exception {
        DocumentBuilderFactory factory =
         DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        DocumentBuilder parser =
         factory.newDocumentBuilder();
        Document doc = parser.parse("inventaire.xml");
    jusque là je pense que l'on est d'accord, le problème c'est après.
    Par logique je pense qu'il faut d'abord extraire les données du document txt pour ensuite modifier le document xml.
    Donc pour charger les infos du doc txt je pourrais faire 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
    16
     
    public static String loadFileString(File achats.txt) throws IOException {
      Reader reader = new InputStreamReader(new FileInputStream(achats.txt), "ascii");
      try {
        StringBuilder builder = new StringBuilder();
        char[] buffer = new char[512];
        int nbRead = reader.read(buffer);
        while(nbRead > 0) {
          builder.append(buffer, 0, nbRead);
          nbRead = reader.read(buffer);
        }
        return builder.toString();
      } finally {
        reader.close();
      }
    }
    Merci d'avance pour vos réponses.

  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
    Hello,

    Citation Envoyé par while.dede Voir le message
    Alors je vais commencer étape par étape donc le début sera :
    Moui. Je vois pas bien l'intérêt des namespaces, mais il faut charger le fichier XML en mémoire comme ça, oui.

    Ce serait tout de même beaucoup plus simple en utilisant la bibliothèque XML tierce JDOM 2 qu'en utilisant org.w3c.dom.*

    Citation Envoyé par while.dede Voir le message
    Donc pour charger les infos du doc txt je pourrais faire comme ceci?
    Houlàlà, qu'est-ce que c'est que toutes ces complications ?

    Pour lire les lignes d'un fichier en Java, on fait comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static List<String> lireLignes(String nomDuFichier) throws IOException {
      Path fichier = Paths.get(nomDuFichier);
      return Files.readAllLines(fichier, StandardCharsets.US_ASCII);
    }
    Ou alors, si le fichier est plutôt gros et qu'il ne faudrait pas le charger entièrement en mémoire, on peut le traiter ligne par ligne pendant qu'on le lit, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static void traiterFichier(String nomDuFichier) throws IOException {
      Path fichier = Paths.get(nomDuFichier);
      try(Stream<String> lines = Files.lines(fichier, StandardCharsets.US_ASCII)) {
        lines.forEach(line -> {
        	// Ici traiter la ligne :
        	System.out.println(line);
        });	  
      }
    }
    De manière générale, je dirais que ton plan devrait être :

    - Lire le fichier XML, entrer ses données dans une Map<String, Long> qui associe le code d'un produit à sa quantité, puis oublier le document XML.
    - Lire le fichier texte ligne par ligne pour modifier les quantités des produits enregistrés dans la Map.
    - Écrire un nouveau fichier XML en se basant sur la Map des produits.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 217
    Points : 218
    Points
    218
    Par défaut
    Bonjour Thelvin, merci pour tes conseils que je suis entrain de lire point par point.
    Pour ta question du début, oui il est vrai que ce serait plus simple d'utiliser bibliothèque JDOM2 mais dans mon cours ils utilisaient org.w3c.dom, du coup je pense que je dois utiliser le même après c'est pas sur tant que ça fonctionne!

    Pour le chargement du fichier, le code en question est un code exemple de mon cours et je dois avouer que je le trouve aussi un peu farfelue.
    Merci pour le code sur la lecture des lignes en java, petite question comment je fais pour charger et enregistrer les infos du document txt?

  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
    Eh bien, je dirais que pour charger les données du fichier, tu peux te servir des virgules qui séparent les différentes informations de chaque ligne.

    Et pour enregistrer les données, tu pourrais utiliser un objet fait pour ça, ou bien juste les garder dans une Map.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 217
    Points : 218
    Points
    218
    Par défaut
    Me revoilà, alors voici ce que j'ai fait, après avoir passé un certain temps sur des erreurs de codage.
    Donc voici mon code java et qui n'affiche pas d'erreurs, par contre il ne modifie pas le fichier inventaire.xml et rien ne change, je déséspère
    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
     
    import javax.xml.parsers.*;
    import org.w3c.dom.*;
     
    public class Inventaire {
     
        public static void main(String[] args) throws Exception {
            Document achats = DocumentBuilderFactory.newInstance()
                .newDocumentBuilder().parse("inventaire.xml");
            achats.getDocumentElement().normalize();
            NodeList produits = achats.getElementsByTagName("produit");
     
            for (int i = 0; i < produits.getLength(); i++) {
                Element produit = (Element) produits.item(i);
                NamedNodeMap attributes = produit.getAttributes();
                for (int j = 0; j < attributes.getLength(); j++) {
                    Node attr = attributes.item(j);
                    System.out.println(attr.getNodeName() + ": "
                        + attr.getNodeValue());
                }
                System.out.println();
            }
        }
    }
    je remets le code xml pour rappel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
     <inventaire>
     <produit code="1" prix="432.00" quantite= "43" />
     <produit code="32" prix="32.00" quantite= "100"  />
     <produit code="321" prix="31.00" quantite= "200"  />
     </inventaire>
    le code xml que je dois obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
     <inventaire>
     <produit code="1" prix="432.00" quantite= "31" />
     <produit code="32" prix="32.00" quantite= "100"  />
     <produit code="321" prix="31.00" quantite= "197"  />
     </inventaire>
    et le fichier txt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Jean Charles, 3214324565, 321, 2
    Yvan Richard, 5435435545, 321, 1
    Yvette Gagnon, 4324324243, 1, 12

  6. #6
    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
    Pour information, ce code :

    - ne fait aucune référence au fichier achats.txt. Il n'apparaît nulle part. Donc forcément, le fichier achats.txt est complètement ignoré.

    - n'écrit pas de fichier inventaire.xml. Il ne fait que le lire, il n'écrit rien. Il ne peut donc pas y avoir de changement dans ce fichier.

    - ne fait aucune modification des objets contenus dans le Document. Par conséquent, même si tu faisais l'étape nécessaire de réécrire le fichier inventaire.xml à l'aide du Document, le fichier produit ne contiendrait aucune modification par rapport au fichier lu, puisque ton code ne modifie rien à rien.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 217
    Points : 218
    Points
    218
    Par défaut
    Bon ce qui est sur c'est que je ne maîtrise pas la programmation DOM pour l'instant, il faut que je reprenne mes cours la dessus du début.

    Je te remercie de ton aide Thelvin, je me permet juste de te demander une faveur, pourrais-tu m'écrire le code valable de cet exercice ou un exemple de ce type d'application pour que je puisse me baser la dessus pour terminer l’exercice. Car je suis sensé l'avoir terminé pour demain et comme tu as pu constater j'en suis loin.

    Je pense que le soucis vient du fait que je me suis pressé à étudier le cours sur DOM, car j'avais cet exos à faire et que j'étais en retard, et du coup je ne l'ai pas étudié en profondeur.

    Bon après faut avouer que mon cours manque cruellement d'exemples, mais heureusement il y a google.
    Mais même en ayant cherché, peut être pas assez, mais je n'ai pas trouvé d'exemples montrant un chargement d'un fichier txt pour mettre à jour un xml.

    Au pire si cela te pose problème, il n'y pas de soucis je m'arrangerais dans tout les cas merci quand même d'avoir essayé de m'aider.

  8. #8
    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
    C'est parce qu'il n'y a pas besoin d'exemple.

    Tu essaies d'être un programmeur alors programme.

    Tu as besoin d'un exemple pour charger un fichier XML, tu en as un.
    Tu as besoin d'un exemple pour lire un fichier texte, Google n'en manque pas.
    Tu as besoin d'un exemple pour écrire un Document DOM dans un fichier XML, Google n'en manque pas non plus.

    Comment faire pour utiliser le Document et les lignes du fichier texte afin de refléter les changements voulus, ça ce n'est pas une question d'exemple.
    C'est la nature même de la programmation. On sait programmer ou on ne sait pas.
    Il n'y a pas d'exemple, parce que ce n'est que de la programmation générale, personne n'aurait l'idée de faire un exemple.

    Commence déjà par montrer ton code qui fait les trois étapes, et montre-nous comment tu essaies de modifier le Document à l'aide des lignes du fichier texte.
    Une fois que tu auras fait ce travail qui n'est qu'une question d'appliquer ce qu'on t'a dit, je verrai si tu bloques sur un point précis.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 217
    Points : 218
    Points
    218
    Par défaut
    Ok merci Thelvin, je vais terminer le travail que j'ai à faire dans ce cours, car j'ai une échéance et je n'ai malheureusement pas le temps de tout revoir, dès que c'est fait je révise mes cours et je reviens sur cet exercice.

Discussions similaires

  1. enregistrer dans fichier xml avec j2me
    Par swinia dans le forum Java ME
    Réponses: 8
    Dernier message: 25/05/2009, 08h53
  2. [JDOM] enregistrer un fichier XML avec JDOM
    Par fatenatwork dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 28/09/2007, 10h42
  3. Transformer un très gros fichier XML avec XSL
    Par wozzz dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 30/05/2006, 10h57
  4. Java et XML : Traitement d'un fichier XML avec JAVA
    Par nice dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 18/05/2006, 21h24
  5. [XML] Comment parser ce fichier XML avec java !
    Par jlassira dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 13/03/2006, 12h56

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