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 :

Faire la somme de données groupées


Sujet :

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

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Octobre 2014
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Collégien
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 36
    Points : 32
    Points
    32
    Par défaut Faire la somme de données groupées
    Bonjour! Je suis entrain de réaliser un programme java qui doit inscrire chaque nom de clients et la somme de leur transactions à l'écran. Je n'arrive pas à faire imprimer la somme des transactions. Quelqu'un pourrait m'aider? Merci

    Voici le fichier XML :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <liste> 
    <client nom="Jean Charles"> 
    <transaction montant="500" />
    <question>Quelle est la dernière marque?</question>
    <transaction montant="1200" /> 
    </client> 
    <client nom="Pierre Élisabeth"> 
    <transaction montant="600" /> 
    <transaction montant="800" /> 
    <question>Où puis-je trouver le modèle 2002?</question>
    <transaction montant="2000" /> 
    </client> 
    </liste>

    Mon code 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
    import org.w3c.dom.*;
    import javax.xml.parsers.*;
     
    public class transactions {
    public static void main(String[] args) throws Exception {
      DocumentBuilderFactory factory = 
      DocumentBuilderFactory.newInstance();
      DocumentBuilder parser = 
      factory.newDocumentBuilder();
      Document doc = parser.parse(args[0]);
      Element racine = doc.getDocumentElement(); 
      NodeList nl = racine.getElementsByTagName("client");
      NodeList nl2 = racine.getElementsByTagName("transaction");
      for (int i = 0; i < nl.getLength(); ++i) {
        Element client = (Element) nl.item(i);
        Element transaction = (Element) nl2.item(i); 
        System.out.println("Nom du client : " + client.getAttribute("nom"));
        System.out.println("Somme : " + transaction.getAttribute("montant"));
        }
    }
    }

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 630
    Points
    21 630
    Par défaut
    Hello,

    L'idée c'est
    - pour chaque client,
    -- pour chaque transaction,
    -- l'ajouter à la somme des transactions.

    Tu dois donc faire deux for() imbriqués : un for() qui parcourt les clients, et un autre for() qui parcourt les transactions de ce client et seulement de ce client.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Octobre 2014
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Collégien
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 36
    Points : 32
    Points
    32
    Par défaut
    Je n'arrive pas à cibler un client à la fois ce qui donne le mauvais résultat représenté ci-dessous :

    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
     
    import org.w3c.dom.*;
    import javax.xml.parsers.*;
     
    public class transactions {
    public static void main(String[] args) throws Exception {
      DocumentBuilderFactory factory = 
      DocumentBuilderFactory.newInstance();
      DocumentBuilder parser = factory.newDocumentBuilder();
      Document doc = parser.parse(args[0]);
      Element racine = doc.getDocumentElement(); 
      NodeList nl = racine.getElementsByTagName("client");
      NodeList nl2 = racine.getElementsByTagName("transaction");
      for (int i = 0; i < nl.getLength(); ++i) {
        Element client = (Element) nl.item(i);
        System.out.println("Nom du client : " + client.getAttribute("nom"));
      for (int j = 0; j < nl2.getLength(); ++j) {
        Element transaction = (Element) nl2.item(j); 
        System.out.println(transaction.getAttribute("montant"));
        }
        }  
    }
    }

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Les transactions sont dans l'objet client, donc c'est pas une liste prise depuis la racine mais une liste prise depuis le client que tu dois récuperer la liste imbriquée. PArce que le code que tu as donnée parcoure toutes les transactions indépendamment du client.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Octobre 2014
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Collégien
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 36
    Points : 32
    Points
    32
    Par défaut
    Comment dois-je faire? Je remplace NodeList nl = racine.getElementsByTagName("client") par NodeList nl = client.getElementsByTagName("client") ?
    Ça ne semble pas fonctionner...

    merci

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Octobre 2014
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Collégien
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 36
    Points : 32
    Points
    32
    Par défaut
    Quelqu'un m'a conseillé d'utiliser getChildNodes() sur chaque élement <client>. Est-ce que quelqu'un sait comment faire?

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 630
    Points
    21 630
    Par défaut
    Non mais getElementsByTagName() c'est mieux.

    ... Par contre, quand tu cherches des éléments "transaction" il faudrait les appeler "transaction", pas autre chose.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Octobre 2014
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Collégien
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 36
    Points : 32
    Points
    32
    Par défaut
    Merci pour votre aide mais je n'y arrive vraiment pas!
    Est-ce que le problème ce situe dans les lignes ci-dessous? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Document doc = parser.parse(args[0]);
    Element racine = doc.getDocumentElement();
    NodeList nl = racine.getElementsByTagName("client");
    NodeList nl2 = racine.getElementsByTagName("transaction");
    Je vois que racine = doc.getDocumentElement(); mais comment puis-je faire référence à l'élément <client> ou à l'élément <transaction> seulement?
    Quelque chose comme Element transaction = doc.getElementsByTagName("transaction") ?

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 630
    Points
    21 630
    Par défaut
    Pour l'élément <client> tu y étais pourtant bien arrivé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Element client = (Element) nl.item(i);
    Ça marche parfaitement.
    Il y a plus qu'à te servir de cette variable client.

    Quelque chose comme Element transaction = doc.getElementsByTagName("transaction") ?
    Ben non -_-°.
    - D'abord getElementsByTagName renvoie un NodeList, c'est-à-dire une liste d'éléments. Normal : il y en a plus d'un, donc il peut pas en renvoyer un, bien sûr -_-°.
    - Ensuite, ce ne sont pas toutes les transactions du document, que tu veux. Ce sont toutes celles du client. Donc il ne faut pas le faire sur doc bien sûr -_-°.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Octobre 2014
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Collégien
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 36
    Points : 32
    Points
    32
    Par défaut
    Bon, maintenant je tente d'utiliser <transaction> avec getChildNode(); . Dois-je utiliser une autre NodeList que "nl" pour parcourir les transactions?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      NodeList nl = racine.getElementsByTagName("client");
      for (int i = 0; i < nl.getLength(); ++i) {
        Element client = (Element) nl.item(i);
        System.out.println("Nom du client : " + client.getAttribute("nom"));
      for (int j = 0; j < nl.getLength(); ++j) {
        NodeList nl2 = transaction.getChildNode(); 
        Element transaction = (Element) nl2.item(j);
     
        System.out.println(transaction.getAttribute("montant"));
        }
        }
    }
    }

  11. #11
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 630
    Points
    21 630
    Par défaut
    Bon c'est n'importe quoi. On arrête les frais.
    Pour l'instant tu oublies les transactions. Elles t'intéressent plus, on les regarde plus.

    Tu vas t'entraîner sur quelque chose de plus simple :
    Un programme qui affiche le nom de tous les clients.

    Fais un programme comme ça et montre-nous le code.

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/10/2011, 05h44
  2. Faire la somme des données identiques
    Par tunis71187 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/09/2011, 14h18
  3. Faire la somme des champs groupés par identifiant
    Par Xavinou57 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 14/12/2008, 15h27
  4. Faire une somme en se basant sur une valeur donnée
    Par caco92 dans le forum Formules
    Réponses: 2
    Dernier message: 09/10/2008, 11h39
  5. Réponses: 10
    Dernier message: 03/10/2006, 20h19

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