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

  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 586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    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 586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    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 586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    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 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
    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.
    Merci pour votre suggestion d'aide.
    Mon programme complet 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
    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
    import java.io.*;
    import java.lang.String;
    import java.lang.Object;
    import org.jdom.*;
    import org.jdom.input.*;
    import org.jdom.output.*;
    import org.jdom.filter.Filter;
    import java.util.List;
    import java.util.Iterator;
    public class parcours {
     
    	static org.jdom.Document document;
    	static Element racine;
    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;
        // element est <phrase>
    	 //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"));
     
    		   }
     
    	}
     
    }
    	public static void main(String[] args){
    		// TODO Auto-generated method stub
     
    		// On crée une instance de SAXBuilder
    		SAXBuilder sxb = new SAXBuilder();
    		try
    		{
    			// On crée un nouveau document JDOM avec en argument le fichier XML
    			// Le parsing est terminé ;)
    			document = sxb.build(new File("ANN20020115.0001.xml"));
     
    		} 
    		catch (Exception e) {System.out.println(e);}
    		// On initialise un nouvel élément racine avec l'élément racine du
    		// document.
     
    		racine= document.getRootElement();
    		System.out.println("Root " + racine); 
    		afficheFiltre();
     
    	}
    }
    Le fichier XML 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
    <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 que le filtre garde la meme structure mais sans prendre en compte les elements <mot> dont l'attribut type vaut "word".
    j'espère que l'explication était claire

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 265
    Par défaut
    Pourquoi ne pas partir sur un simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IteratorIterable<Element> mot = racine.getDescendants(new ElementFilter("mot"));

  9. #9
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IteratorIterable<Element> mot = racine.getDescendants(new ElementFilter("mot"));
    à quel endroit je dois ajouter ce bout de code? et à quoi ça sert??

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 265
    Par défaut
    Normalement cela peut te servir à extraire uniquement la valeur de la balise <nature> si attribut type = ident. Il me semble avoir compris que tu souhaitais cela. Mais peut être que je me trompe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    static void selectIdent(Document xml) {
    		Element racine = xml.getRootElement();
    		IteratorIterable<Element> mot = racine
    				.getDescendants(new ElementFilter("mot"));
    		while (mot.hasNext()) {
    			Element elt = mot.next();
    			if (elt.getAttribute("type").getValue().equals("ident")) {
    				System.out.println(elt.getChild("nature").getValue());
    			}
    		}
    	}

  11. #11
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Citation Envoyé par amira barhoumi Voir le message
    Je voudrais que le filtre garde la meme structure mais sans prendre en compte les elements <mot> dont l'attribut type vaut "word".
    j'espère que l'explication était claire
    Plus ou moins. Un filtre ne garde pas de structure. Un filtre accepte ou rejette un élément, et laisse voir ceux qui ont été acceptés, soit dans une List, soit dans un IteratorIterable. Aucun des deux ne garde de structure.

    Alors je ne suis pas sûr de comprendre à quoi tu pensais.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    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.

  13. #13
    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, 16h34
  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, 18h13
  3. Réponses: 1
    Dernier message: 17/03/2007, 21h32
  4. Réponses: 5
    Dernier message: 15/08/2006, 17h51
  5. Réponses: 1
    Dernier message: 20/05/2006, 12h46

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