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 :

Parcours total d'un fichier XML [JDOM]


Sujet :

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

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 83
    Points : 46
    Points
    46
    Par défaut Parcours total d'un fichier XML
    Bonjour,
    Je veux parcourir un fichier XML en utilisant JDOM. Ce que j'ai constaté est que le parcours se fait en spécifiant l’élément. Je cherche comment je peux faire un parcours total du document mais JDOM ne fournit pas une méthode pour cela. Donc je sais que je dois créer ma propre méthode mais le problème que je ne suis pas bien en java. La vérité que je suis débutante en java
    Pouvez-vous m'aidez s'il vous plait

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    En quoi les méthodes getChildren() / getAttributes() ne te permettent pas de parcourir tout le document?

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 83
    Points : 46
    Points
    46
    Par défaut
    Bonjour,
    oui malheureusement je trouve que chaque fois je suis obligé d'indiquer un élément spécifique pour utiliser ces deux méthodes.
    par exemple je trouve ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    static void afficheALL()
    {
    List listEtudiants = racine.getChildren("etudiant");
    Iterator i = listEtudiants.iterator();
    while(i.hasNext())
    {
    Element courant = (Element)i.next();
    System.out.println(courant.getChild("nom").getText());
    }
    }
    je dois positionné dans l'élément étudiant pour afficher leurs noms.
    le fichier XML que j'ai construis est composé de plusieurs éléments donc c'est pas logique de ce positionné chaque fois a un élément spécifique.
    je veux parcourir le fichier total avec un test sur ces éléments. par exemple si l’élément correspond a un étudiant je le met dans un tableau étudiant et si l'élément correspond a un professeur je le met dans un tableau professeur. les tableaux sont les sorties de mon programme
    donc le fichier est composé par <etudiant>, <professeur>, <administration>
    j’espère que l'idée est claire maintenant
    merci pour votre aide

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List enfants = racine.getChildren();
    Comme ej l'ai dit, tu n'as pas besoin de préciser l'enfant que tu chercher....

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 83
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List enfants = racine.getChildren();
    Comme ej l'ai dit, tu n'as pas besoin de préciser l'enfant que tu chercher....
    Merci,
    Oui je sais que cette commande permet de récupérer tous éléments de racine. Mais le problème c'est que chaque élément possède des sous éléments aussi. De plus je besoin d'une méthode qui permet de tester si l’élément correspond à un étudiant ou bien à un professeur.
    Voici un extrait du fichier 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
    <?xml version="1.0" encoding="UTF-8"?>
    <personne>
    <etudiant>
    <nom> Ahlem</nom>
    <prenom>Rhayem</prenom>
    </etudiant>
    <professeur>
    <nom> XXXXXX</nom>
    <prenom>YYYYY</prenom>
    </professeur>
    <administration>
    <responsable>ZZZZ</responsable>
    </administration>
    </personne>
    Le code du test est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (racine.getChildren()=="etudiant")
    system.out.printlen("c'est un etudiant");
    else if (racine.getChildren()=="professeur")
    system.out.printlen("c'est un professeur");
    else 
    system.out.printlen("c'est un administrateur");
    Malheureusement ça marche pas avec moi l'erreur est que n'est pas logique de comparer un élément avec une chaîne de caractère.
    S’il vous plait je besoin de votre aide. Dites-moi comment je peux faire ce test.
    J’espère que vous me comprend maintenant
    Merci beaucoup

  6. #6
    Membre régulier
    Inscrit en
    Septembre 2010
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 121
    Points : 74
    Points
    74
    Par défaut
    Presque ça. sauf que == pour une chaîne de caractère # de equals :

    pour simplifier, == vaut VRAI si les 2 objets sont les mêmes, et equals() vaut VRAI si les 2 objets ont un contenu équivalent.

    En gros pour allez un peu plus loin en java quand tu utilise le == on va allez voir si les 2 objets ont la même références (dans le même emplacement de mémoire) En gros == compare la référence sur l'objet pas le contenu.

    Tu peux testé un truc bateau genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    String obj1 = new String("xyz");
     
    String obj2 = new String("xyz");
     
    if(obj1 == obj2)
       System.out.println("obj1==obj2 plop");
    else
      System.out.println("obj1==obj2 pas plop");
    Tu verra tu aurra toujours pas plop.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (racine.getChildren()=="etudiant")
    system.out.printlen("c'est un etudiant");
    else if (racine.getChildren()=="professeur")
    system.out.printlen("c'est un professeur");
    else 
    system.out.printlen("c'est un administrateur");


    Donc ton code :



    if(racine.getChildren().equals("etudiant")){
    ...
    }

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ouais, enfin, faut un peu réfléchir à ce que tu fais aussi et pas mettre les bout de code au hasard. Dis toi que ton JDom c'est un arbre hein. JDom te fournis des méthodes pour savoir ce qu'il y a à chaque niveau, quels sont les enfants, etc. Après, à toi d'en faire quelque chose d'utile. Là t'es occupé de comparer un cageot de pommes avec une poire .


    Première chose. On ne fais JAMAIS de == avec des String, on utilise equals()

    Ensuite, getChildren, il te renvoie pas "Etudiant", il te renvoie une java.util.List. Et cette java.util.List d'objets de type Element. A toi donc de la pacourir. Enfin, chacun de ces Element, possède un méthode bien à propos appelée "getName()" qui permet de savoir quel était le nom du tag. Nom que tu pourra comparer à ton "etudiant" avec equals et prendre une décision en conséquence.

  8. #8
    Membre confirmé Avatar de freddou17
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 341
    Points : 566
    Points
    566
    Par défaut
    Bjr,

    Avec JDom et une méthode récursive

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private void parserFichier(List<Element> elmts) throws ClassNotFoundException{
    		for (Element elmt : elmts) {
                            if("etudiant".equals(elmt.getName()){
                                  //ajout dans ton tableau
                            }
     
    			List<Element> children = elmt.getChildren();
     
    			if(!children.isEmpty()){
    				parserFichier(children);
    			}
    		}
    	 }
    ++ bon courage
    "Aucun de nous ne sait ce que nous savons tous, ensemble."
    Lien vers mon appli Funcash n'hésitez pas à donner votre avis

  9. #9
    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 freddou17 Voir le message
    Avec JDom et une méthode récursive
    Mais non pas besoin de récursif avec cet exemple-là.
    Il de prendre les fils de <personne>, puis pour chacun regarder si c'est <etudiant> ou <professeur> et regarder ses fils à lui.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre confirmé Avatar de freddou17
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 341
    Points : 566
    Points
    566
    Par défaut
    Autant pour moi je n'avais pas regardé la structure du xml...

    Du coup il peut peut-être utiliser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    racine.getChildren("etudiant ou personne") pour l’élément courant
    ++
    "Aucun de nous ne sait ce que nous savons tous, ensemble."
    Lien vers mon appli Funcash n'hésitez pas à donner votre avis

  11. #11
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 83
    Points : 46
    Points
    46
    Par défaut
    Bonjour et Merci beaucoup pour vos réponses.
    ce que j'ai compris c'est que la méthode getName() permet de fournir le nom de l’élément. J’utilise cette méthode comme suit mais rien ne s’affiche
    Alors qu'elle est le problème?

    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
    SAXBuilder builder = new SAXBuilder();
     
    File fichierXML = new File("Exercice1.xml");
    Document document;
    try {
    	/* Parsing du fichier */
    	document = builder.build(fichierXML);
     
    	/* Racine du document XML : dans notre cas <diagramme> */
    	Element rootNode = document.getRootElement();
     
    	/* On récupère tous les élément classe du fichier XML */
    	List <Element>liste = rootNode.getChildren("application");
     
    	/* Boucle sur tous les éléments "classe" du fichier XML */
    	for (Element eClasse : liste) {
    		/* Affichage du nom du la classe */
     
    		System.out.println(eClasse.getName());
    		}
    	}
    catch (JDOMException e) {
    	e.printStackTrace();
    }

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    tu peux montrer le xml qui correspond?

  13. #13
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 83
    Points : 46
    Points
    46
    Par défaut
    Bonjour,
    c'est presque le même fichier XML précédent. désolé j'oublie de remplacer "application" par "personne".
    soit par exemple T un tableau de chaîne de caractère. donc tout d'abord je fais le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(racine.getChildren.getName().equals("etudiant"))
    {T[i]=racine.getChildren().getName;
    }
    je suis désolé pour ces questions parce que je suis débutante en java, et je trouve que JDOM rassemble aussi a un langage , mais merci beaucoup pour vos réponses

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par ahlemrhayem Voir le message
    Bonjour,
    c'est presque le même fichier XML précédent.
    ok, si on retire remplace application par personne et qu'on reprend ton code, analysons.

    Ton fichier xml a cette structure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    personne
      etudiant
        nom
        prenom
      professeur
        nom
        prenom
      administration
        responsable
    donc le rootElement, c'est personne. Ton code maintenant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Element rootNode = document.getRootElement();
     
    	/* On récupère tous les élément classe du fichier XML */
    	List <Element>liste = rootNode.getChildren("personne");
     
    	/* Boucle sur tous les éléments "classe" du fichier XML */
    	for (Element eClasse : liste) {
    		/* Affichage du nom du la classe */
     
    		System.out.println(eClasse.getName());
    		}
    	}
    donc rootNode = Personne. Ensuite tu fais dessus un getChildren("personne"), donc tu cherche tous les tags "personne" présents à l'intérieur de personne. Il n'y en a pas. Par contre, si tu fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	List <Element>liste = rootNode.getChildren();
    Tu auras bien les noeuds etudiant, professeur et administration dans ta liste, ce que la boucle en dessous confirmera.

  15. #15
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 83
    Points : 46
    Points
    46
    Par défaut
    Bonjour pour tous,
    Après ces nombreuses questions qui montre que je suis faible en java, et après vos conseils et vos aides et après l’organisation de mes idées. Je réussi de développer ce code pour ce fichier. Donc tout d'abord je vous montre le code et le fichier puis le résultat fournit qui est malheureusement n'est totalement juste. La question parait très banale pour vous les experts mais pour moi c’est un peu difficile.
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <application>
      <controler id="P2">SAGT</controler>
      <observed_element>vehicule</observed_element>
      <observer>capteur</observer>
      <measure seuil_min="" seuil_max="">
        <instant />
        <intervalle>
          <instant_debut />
          <instant_fin />
        </intervalle>
      </measure>
      <alerte>
        <instant />
        <intervalle>
          <instant_debut />
          <instant_fin />
        </intervalle>
      </alerte>
      <actuator identifiant="">PMV</actuator>
      <event>
        <incident>
          <instant />
          <intervalle>
            <instant_debut />
            <instant_fin />
          </intervalle>
        </incident>
        <TDM>
          <instant />
          <intervalle>
            <instant_debut />
            <instant_fin />
          </intervalle>
        </TDM>
      </event>
    </application>
    // Le code de test: l'objectif de ce code est de faire de test sur les éléments du fichier XML précédent. Si les éléments sont (instant ou intervalle) alors je dois les mets dans un tableau TEMPS avec leurs sous éléments (sans faire de test pour ces éléments). Si ils ne correspondent pas à (instant ou intervalle) alors je mets le nom de ces éléments dans un tableau Autres et je fais un test pour ces sous éléments (s'ils sont des instants ou des intervalles)). J’espère que l'idée est clair donc je mets les éléments de temps dans un tableau temps et les autres dans un tableau autres. Voici le 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
    private static void parserFichier(List<Element> elmts) throws ClassNotFoundException{
    		ArrayList temps = new ArrayList();
    		ArrayList Autres = new ArrayList();
    		for (Element elmt : elmts) {
    	                        if(("instant".equals(elmt.getName()))||("intervalle".equals(elmt.getName()))) {
     
    	                     temps.add(elmt.getName());
    	                     List<Element> children = elmt.getChildren();
    	                     if(elmt.getChildren().isEmpty()){temps.add(elmt.getText());}
    	                     else{for (Element child : children) {temps.add(child.getName());}
     
    	                        }}
     
    	                        else{
    	                        	Autres.add(elmt.getName());
    	                        	if(elmt.getChildren().isEmpty()){Autres.add(elmt.getText());}
    	                        }
     
    				List<Element> children = elmt.getChildren();
     
    				if(!children.isEmpty()){
    					parserFichier(children);
    				}
    			}
    		System.out.println("le temps");
    		System.out.println(temps);
    		System.out.println("le domaine");
    		System.out.println(Autres);
    		 }
    // le résultat de ce code est le suivant. le problème c'est que je trouve beaucoup de tableaux alors que je besoin seulement de deux tableaux un qui contient les éléments de temps sans répétition et l'autres qui contient les autres éléments //
    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
    le temps
    []
    le domaine
    [instant_debut, , instant_fin, ]
    le temps
    [instant, , intervalle, instant_debut, instant_fin]
    le domaine
    []
    le temps
    []
    le domaine
    [instant_debut, , instant_fin, ]
    le temps
    [instant, , intervalle, instant_debut, instant_fin]
    le domaine
    []
    le temps
    []
    le domaine
    [instant_debut, , instant_fin, ]
    le temps
    [instant, , intervalle, instant_debut, instant_fin]
    le domaine
    []
    le temps
    []
    le domaine
    [instant_debut, , instant_fin, ]
    le temps
    [instant, , intervalle, instant_debut, instant_fin]
    le domaine
    []
    le temps
    []
    le domaine
    [incident, TDM]
    le temps
    []
    le domaine
    [controler, SAGT, observed_element, vehicule, observer, capteur, measure, alerte, actuator, PMV, event]
    NB: pour les éléments j'affiche aussi leurs valeur (getText()).
    merci pour vos aides et je suis désolé pour ces questions qui sont longs et beaucoup

  16. #16
    Membre confirmé Avatar de freddou17
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 341
    Points : 566
    Points
    566
    Par défaut
    slt,

    tu utilises la récursivité du coup du dois initialiser les tableaux temps et autres en dehors de ta méthode (variable de classe ou paramètre de type final).
    Dans ton cas tu créer les tableaux temps et autres à chaque appel de la méthode parserFichier et à aucun moment tu assemble ces tableaux...

    ex: (pas testé)
    Code java : 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
     
    ArrayList temps = new ArrayList();
    	ArrayList autres = new ArrayList();
    	private static void parserFichier(List<Element> elmts, List temps, List autres) throws ClassNotFoundException{
    		for (Element elmt : elmts) {
    			if(("instant".equals(elmt.getName()))||("intervalle".equals(elmt.getName()))) {
    				 temps.add(elmt.getName());
    				 List<Element> children = elmt.getChildren();
    				 if(elmt.getChildren().isEmpty()){
    					 temps.add(elmt.getText());
    				 }else{
    					 for (Element child : children) {
    						 temps.add(child.getName());
    					 }
    				 }	
    			}else{
    	        	    autres.add(elmt.getName());
    	        	    if(elmt.getChildren().isEmpty()){
    	        		autres.add(elmt.getText());
    	        	     }
    	                }
    			List<Element> children = elmt.getChildren();
    			if(!children.isEmpty()){
    				parserFichier(children);
    			}
    		}
    		System.out.println("le temps");
    		System.out.println(temps);
    		System.out.println("le domaine");
    		System.out.println(Autres);
    	}

    ++
    "Aucun de nous ne sait ce que nous savons tous, ensemble."
    Lien vers mon appli Funcash n'hésitez pas à donner votre avis

  17. #17
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 83
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par freddou17 Voir le message
    slt,

    tu utilises la récursivité du coup du dois initialiser les tableaux temps et autres en dehors de ta méthode (variable de classe ou paramètre de type final).
    Dans ton cas tu créer les tableaux temps et autres à chaque appel de la méthode parserFichier et à aucun moment tu assemble ces tableaux...

    ex: (pas testé)
    Code java : 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
     
    ArrayList temps = new ArrayList();
    	ArrayList autres = new ArrayList();
    	private static void parserFichier(List<Element> elmts, List temps, List autres) throws ClassNotFoundException{
    		for (Element elmt : elmts) {
    			if(("instant".equals(elmt.getName()))||("intervalle".equals(elmt.getName()))) {
    				 temps.add(elmt.getName());
    				 List<Element> children = elmt.getChildren();
    				 if(elmt.getChildren().isEmpty()){
    					 temps.add(elmt.getText());
    				 }else{
    					 for (Element child : children) {
    						 temps.add(child.getName());
    					 }
    				 }	
    			}else{
    	        	    autres.add(elmt.getName());
    	        	    if(elmt.getChildren().isEmpty()){
    	        		autres.add(elmt.getText());
    	        	     }
    	                }
    			List<Element> children = elmt.getChildren();
    			if(!children.isEmpty()){
    				parserFichier(children);
    			}
    		}
    		System.out.println("le temps");
    		System.out.println(temps);
    		System.out.println("le domaine");
    		System.out.println(Autres);
    	}

    ++
    Merci bien,
    Malheureusement ça marche pas . Pour la méthode parserFichier tu ajoutes comme paramètres (temps et autres) mais lors de l'appel de cette méthode d'une manière récursive tu n'ajoutes pas ces deux méthodes et donc c'est parait comme erreur. D’où j'ajoute ces éléments à l’appel récursive mais malheureusement je trouve plusieurs tableaux qui se répètent. De plus j'avais un problème au niveau de test. L’idée est si je trouve un élément qui est (instant ou intervalle) alors je l'ajoute avec ces sous éléments au tableau temps (parce que ces sous éléments sont considérés aussi comme des éléments pour le temps) mais si l'élément courant est différent de (instant ou intervalle) alors je l'ajoute au tableau autres mais je fais le test sur ces sous éléments pour savoir est ce qu'ils contiennent des éléments de temps ou non). Mais malheureusement je trouve dans le tableau domaine les éléments (instan_debut et instant_fin) qui sont normalement dans le tableau temps. De plus les deux tableaux contiennent des répétitions des éléments donc je pense qu'il faut avoir un autre test pour qu'on ajoute que seulement l'élément qui n'existe pas le tableau. S'il vous plait aider moi a corrigé ce code selon ces remarques je sais que c'est très facile pour les experts.
    Merci bien

  18. #18
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Lors de l'appel principal de parseFichier(List<Element> elmts, List<String> temps, List<String> autres), tu passes les 3 listes en paramètres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    List<Element> elmts = .... // ici ton appel à getChildren() pour avoir cette liste...
    List<String> temps = new ArrayList<String>();
    List<String> autres = new ArrayList<String>();
     
    parseFichier(elmts, temps, autres );
     
    // maintenant, temps et autres contiennent tout ce qui a été ajouté dans tous les appels récursifs
    System.out.println("le temps");
    System.out.println(temps);
    System.out.println("le domaine");
    System.out.println(Autres);
    Bien sûr dans l'appel récursif de parseFichier, il faut passer ces mêmes instances de List.

    Pour éviter d'avoir plusieurs fois la même valeur dans temps et autres, tu peux utiliser contains() de List, qui teste si un élément est déjà présent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private static void addOnce(List<String> list, String text) {
       if ( !list.contains(text) ) list.add(text);
    }
    Tu peux également utiliser un Set, qui garantit l'unicité d'une valeur : un HashSet si l'ordre n'est pas important, ou un LinkHashSet si l'ordre d'ajout doit être conservé.

    Par contre, je vois que tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if ( elmt.getChildren().isEmpty() ) {
       temps.add(elmt.getText());
    } else {
       for (Element child : children) {
           temps.add(child.getName());
       }
    }
    d'une part et d'autre part :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(elmt.getChildren().isEmpty()){
        autres.add(elmt.getText());
    }
    Le code du bloc if le même pour tous les éléments, à la liste près. Et le code du bloc else est redondant par rapport à l'appel récursif (l'appel récursif ajoute bien les noms des enfants à temps, donc fait la même chose que le else, pour temps).

    On peut même factoriser le traitement en utilisant une méthode intermédiaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void collect(List<String> list, Element elmt, boolean addText) {
        addOnce(list, elmt.getName());
        if ( addText ) {
            addOnce(list, elmt.getText());
        }
    }
    Ce qui donne au final :
    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
     
    private static void parserFichier(List<Element> elmts, List<String> temps, List<StringW autres) throws ClassNotFoundException{
       for (Element elmt : elmts) {
          List<Element> children = elmt.getChildren();
          switch( elmt.getName() ) { // (en java 7+, uniquement, c'est plus simple (et plus rapide) de faire comme ça (à la place du if/else et des equals())
             case "instant":
             case "intervalle":
                 collect( temps, elmt, children.isEmpty() );
                 break;
             default:
                 collect( autres, elmt, children.isEmpty() );
          }
          if(!children.isEmpty()){
    	  parserFichier( children, temps, autres ); 
          }
       }
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  19. #19
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 83
    Points : 46
    Points
    46
    Par défaut
    Merci beaucoup pour votre aide,
    au niveau de test lorsque tu utilises swich et lorsque je compile le programme je trouve un erreur "cannot swich on a value of type String.only convertible int values or enum constant are permitted" je ne peux pas comprendre cela. donc je le modifie en utilisant if avec quelques changement et cv ça marche voici le modification que je fais:
    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
     
    private static void parserFichier(List<Element> elmts, List temps, List autres) throws ClassNotFoundException{
    		for (Element elmt : elmts) {
    			if(("instant".equals(elmt.getName()))||("intervalle".equals(elmt.getName()))) {
    				 temps.add(elmt.getName());
    				 List<Element> children = elmt.getChildren();
    					 for (Element child : children) {
    						 temps.add(child.getName());
    					 }
    				 }	
    			else{
    	        	    autres.add(elmt.getName());
    	        	    if(elmt.getChildren().isEmpty()){
    	        		autres.add("nom="+elmt.getText());
    	        	     }
    	        	    else {
    			List<Element> children = elmt.getChildren();
    			if(!children.isEmpty()){
    				parserFichier(children,temps, autres);
    			}
    		}
    			}
    Maintenant je veux connaitre comment je peux afficher ces deux tableaux dans une fenêtre Jframe?
    Merci mes amis

  20. #20
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ahlemrhayem Voir le message
    Merci beaucoup pour votre aide,
    au niveau de test lorsque tu utilises swich et lorsque je compile le programme je trouve un erreur "cannot swich on a value of type String.only convertible int values or enum constant are permitted" je ne peux pas comprendre cela.
    Cette syntaxe n'est utilisable que en Java 7, et tu dois être dans un Java antérieur. Il serait temps que tu passes au moins au 7, voire 8, la dernière version. Si tu conserves ta version de java actuelle, il faut transformer le switch en"if/else", comme tu l'as fait dans ton propre code (je viens de voir que les redondances que je t'avais indiquées ne sont plus de mise : en fait, il y avait un else était mal placé dans le code initial).

    Afficher quelque chose dans une JFrame n'a rien à voir avec le parcours de xml avec JDOM. Surtout qu'il y a beaucoup de façons d'afficher. Consultes pour ça les faqs et tutoriels de Developpez, et, éventuellement, pose une nouvelle question (nouvelle discussion) à ce sujet en décrivant exactement comment tu voudrais l'afficher et ce que tu n'arrives pas à faire sans les tutoriels.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [DOM] problème lors du parcours du fichier xml
    Par krfa1 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 11/05/2007, 07h24
  2. [DOM] Besoin d'optimiser le parcours d'un fichier XML
    Par stardeus dans le forum Format d'échange (XML, JSON...)
    Réponses: 19
    Dernier message: 08/04/2007, 17h04
  3. Réponses: 1
    Dernier message: 15/08/2006, 01h35
  4. Parcours fichier xml
    Par Christophe Charron dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 22/05/2006, 20h37

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