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 :

Problème de filtrage selon la valeur d'un attribut [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 averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2011
    Messages : 28
    Par défaut Problème de filtrage selon la valeur d'un attribut
    j'ai un fichier xml dont la forme générale est la suivante:
    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
    <texte>
    <phrase>
    <mot type="word">
    <nature val="comm">ali</nature>
    <nature val="ident"></nature>
    </mot>
    <mot type="ident">
    <nature val="comm">nom</nature>
    <nature val="ident"></nature>
    </mot>
    <mot type="word">
    <nature val="comm">amir</nature>
    <nature val="ident"></nature>
    </mot>
    <mot type="ident">
    <nature val="comm">nom</nature>
    <nature val="ident"></nature>
    </mot>
    </phrase>
    <phrase>
    .
    .
    .</phrase>
    </texte
    je voudrais filtrer ce fichier xml selon l'attribut type de l'Element mot.C'est-à-dire que le filtre que je voudrais créer, permettra de ne prendre en compte que les elements mot dont le type est ident . le code que j'ai utilisé est le suivant:
    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
    static void afficheFiltre(){
    	//On crée un nouveau filtre
    	Filter filtre = new Filter()
    	{
     
    	/**
                     * 
                     */
    		private static final long serialVersionUID = 1L;
     
    	//On définit les propriétés du filtre à l'aide de la méthode matches
    	public boolean matches(Object ob)
    	{
     
    	//1 ère vérification : on vérifie que les objets qui seront filtrés sont bien des Elements
    	 if(!(ob instanceof Element))
    	  {return false;}
     
     	//On crée alors un Element sur lequel on va faire les vérifications suivantes.
         Element element = (Element)ob;
    	 //2 ème vérification: on vérifie que le type est bien "ident"
         int verifType = 0;
     
    	 List listMot= element.getChildren("mot");
    	 Iterator i =listMot.iterator();
    	 while (i.hasNext())
    	    {
                  Element courant= (Element)i.next();
    	        if (courant.getAttributeValue("type").equals("ident")) 
                    {verifType= 1;}else {verifType=0;}
     
    	    }
     
    	 //verification des conditions
    	  if (verifType == 1)
    	   	 {
     
    	   	 return true;
    	   	 }
    	   	 else 
    	   	 {return false;}
     
    	}
    	}; // fin filtre
    	List resultat= racine.getContent(filtre);
    	Iterator j= resultat.iterator();
    	while(j.hasNext())
    	{
    		  Element courant1 = (Element) j.next();
    		  List listM=courant1.getChildren("mot");
    		  Iterator k= listM.iterator(); 
    		   while(k.hasNext())
    		   {
    			  Element cour= (Element)k.next();
    			 System.out.println(cour.getChildText("nature"));
     
    		   }
     
    	}
     
    }
    Ce que j'ai comme résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ali
    nom
    amir
    nom
    Or moi, je voudrais avoir
    je ne sais pas quoi faire.pouvez-vous m'aider

  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
    Pourquoi tu fais getChildren() alors que tu cherches à vérifier si l'élément en cours, et rien d'autre, est un <mot> ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2011
    Messages : 28
    Par défaut
    l'element courant est phrase, non pas mot !!!

  4. #4
    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
    Citation Envoyé par amira barhoumi Voir le message
    l'element courant est phrase, non pas mot !!!
    Ben... C'est stupide -_-°.

    Tu t'en sers comment, de ce filtre ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2011
    Messages : 28
    Par défaut
    Ben... C'est stupide -_-°.
    merci pour le compliment
    Tu t'en sers comment, de ce filtre ?
    à ton avis, comment dois-je procéder????????

  6. #6
    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
    Citation Envoyé par amira barhoumi Voir le message
    merci pour le compliment
    Tu aurais préféré "si ce que tu cherches à filtrer sont des <mot>, et que les éléments vérifiés par le Filter ne sont jamais des <mot>, alors ça ne peut évidemment pas marcher, le mécanisme et la documentation de Filter sont très clairs là-dessus" ?

    Citation Envoyé par amira barhoumi Voir le message
    à ton avis, comment dois-je procéder????????
    getDescendants(Filter)

    Mais bon, si tu veux de l'aide, c'est à toi de montrer ce que tu as fait, en expliquant la logique.
    Nous on t'expliquera pourquoi ça coince et on donnera des conseils pour une programmation plus simple.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    @amira barhoumi
    [1] C'est clair que vous voulez travailler le document dans le filter comme dans la dernière partie de l'AfficheFiltre, au niveau de phrase étant l'enfant de la racine texte. C'est faisable, mais du coup la fonctionalité majeure du filtre est d'abord en filtrant les phrase qui ont comme enfants éléments mot avec un attribut type de valeur ident. Donc, c'est l'existence qui dirige comment la méthode matches doit être codée.

    [1.1] Précisément, l'existence est bien cassée.
    while (i.hasNext())
    {
    Element courant= (Element)i.next();
    if (courant.getAttributeValue("type").equals("ident"))
    {verifType= 1;}else {verifType=0;}

    }
    Or, c'est faux. Cela a l'effet que la dernière enfant mot déterminerait le résultat true ou false. C'est grave et c'est faux.

    Il faut écrire plutôt comme ça ou quelque variant de ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        while (i.hasNext() && verifType==0)
        {
            Element courant= (Element)i.next();
            if (courant.getAttributeValue("type").equals("ident")) 
                {verifType= 1;}else {verifType=0;}
         }
    Comme ça la fonctionalité verifiant l'existence s'est réetablie.

    [1.2] Avec le filtre bien corrigé, vous pouvez faire simplement et logiquement la dernière partie d'AfficheFiltre comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        while(k.hasNext())
        {
             Element cour= (Element)k.next();
             if (cour.getAttributeValue("type").equals("ident")) {
                 System.out.println(cour.getChildText("nature"));
             }
         }
    [2] Je veux dire aussi que on n'a pas totalement mis en valeur dans ce cas-ci la construction de filtre. Il vaut mieux et conceptuellement plus satisfaisant à mon sens de filtre directement la balise mot.

    [2.1] Dans ce cas, la méthode matches s'écrit comme ça.
    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
        public boolean matches(Object ob) {
            if(!(ob instanceof Element)) {
                return false;
            }
            Element element = (Element)ob;
            if (!element.getName().equals("mot")) {
                return false;
            } else {
                 if (element.getAttributeValue("type").equals("ident")) {
                     return true;
                 } else {
                     return false;
                 }
            }
        }
    Ca devient plus clair comme intention.

    [2.2] Avec le filtre filtrant les éléments mot directement, il faut modifier naturellement la dernière partie où le texte du premier élément est montré.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        List resultat= racine.getDescendants(filtre);
        Iterator j= resultat.iterator();
        while(j.hasNext()) {
            Element courant=(Element)j.next();
            System.out.println(courant.getChildText("nature"));
        }
    Là aussi, ça devient plus clair.

  8. #8
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2011
    Messages : 28
    Par défaut
    @tsuji
    Je te remercie infiniment pour votre explication détaillée.
    Votre réponse était trop fructueuse . J'ai abouti mon résultat souhaité .
    C'est formidable. Je te remercie encore une fois.

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

Discussions similaires

  1. [XPATH] Selectionner un noeud selon la valeur de son attribut
    Par Gregco dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 29/10/2007, 15h34
  2. [XSLT] Création d'un filtre selon la valeur d'un attribut
    Par lemok dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 07/05/2007, 17h13
  3. Réponses: 1
    Dernier message: 17/03/2007, 20h32
  4. Réponses: 5
    Dernier message: 15/08/2006, 16h51
  5. Réponses: 1
    Dernier message: 20/05/2006, 11h46

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