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 :

appliquer une condition pour extraire une valeur de tags


Sujet :

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

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 150
    Points : 45
    Points
    45
    Par défaut appliquer une condition pour extraire une valeur de tags
    Bonjour a tous,

    Tout d'abord j'espère que vous vous portez tous bien en cette période particulière.
    Je reprends mon projet après quelque mois de veille voici mon problème.
    je recherche a récupérer des " valeurs" de balise xml via une code java. voici ci dessous un exemple des balises 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
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <Abd>
        <AbdUid mid="1610884">
            <AseUid mid="1610716">
                <codeType>D-OTHER</codeType>
                <codeId>LF886</codeId>
            </AseUid>
        </AbdUid>
        <Avx>
            <codeType>GRC</codeType>
            <geoLat>475351.00N</geoLat>
            <geoLong>0020951.00E</geoLong>
            <codeDatum>WGE</codeDatum>
        </Avx>
    </Abd>
    <Abd>
        <AbdUid mid="1610886">
            <AseUid mid="1610718">
                <codeType>P</codeType>
                <codeId>LFP3</codeId>
            </AseUid>
        </AbdUid>
        <Avx>
            <codeType>GRC</codeType>
            <geoLat>440533.57N</geoLat>
            <geoLong>0004745.78E</geoLong>
            <codeDatum>WGE</codeDatum>
        </Avx>
        <Avx>
            <codeType>CWA</codeType>
            <geoLat>440843.39N</geoLat>
            <geoLong>0004915.36E</geoLong>
            <codeDatum>WGE</codeDatum>
            <geoLatArc>440620.00N</geoLatArc>
            <geoLongArc>0005100.00E</geoLongArc>
            <valRadiusArc>5</valRadiusArc>
            <uomRadiusArc>KM</uomRadiusArc>
        </Avx>
        <Avx>
            <codeType>GRC</codeType>
            <geoLat>440344.77N</geoLat>
            <geoLong>0005204.28E</geoLong>
            <codeDatum>WGE</codeDatum>
        </Avx>
    </Abd>
    <Abd>
        <AbdUid mid="1613280">
            <AseUid mid="1613162">
                <codeType>CTR</codeType>
                <codeId>LFQE</codeId>
            </AseUid>
        </AbdUid>
        <Avx>
            <codeType>RHL</codeType>
            <geoLat>492215.00N</geoLat>
            <geoLong>0053120.00E</geoLong>
            <codeDatum>WGE</codeDatum>
        </Avx>
        <Avx>
            <codeType>GRC</codeType>
            <geoLat>492215.00N</geoLat>
            <geoLong>0055000.00E</geoLong>
            <codeDatum>WGE</codeDatum>
        </Avx>
        <Avx>
            <codeType>GRC</codeType>
            <geoLat>490231.00N</geoLat>
            <geoLong>0055000.00E</geoLong>
            <codeDatum>WGE</codeDatum>
        </Avx>
        <Avx>
            <codeType>GRC</codeType>
            <geoLat>490000.00N</geoLat>
            <geoLong>0054526.00E</geoLong>
            <codeDatum>WGE</codeDatum>
        </Avx>
        <Avx>
            <codeType>GRC</codeType>
            <geoLat>490000.00N</geoLat>
            <geoLong>0053120.00E</geoLong>
            <codeDatum>WGE</codeDatum>
        </Avx>
    </Abd>

    mon code ci dessous marche bien a savoir qu'il m'extrait l'ensemble de ce qui ce trouve entre les tags <Abd>

    ce que je recherche, c'est que mon code ne me ressorte que le contenu du tag <Abd> si la valeur du tag fils de ASEUID codeType est egal a R par exemple (si je peux en mettre plusieurs tant mieux)
    Voici 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
    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
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    package aip;
     
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.io.Reader;
    import java.nio.file.Files;
    import java.nio.file.Paths;
     
    import javax.xml.namespace.QName;
    import javax.xml.stream.XMLInputFactory;
    import javax.xml.stream.XMLStreamException;
    import javax.xml.stream.XMLStreamReader;
    import javax.xml.stream.events.XMLEvent;
     
    public class AIP {
     
        public static void main(String[] args) throws IOException, XMLStreamException {
     
    		String fichier = "/Users/moi/Mes Documents/sources test/x.xml";
                    QName abd = QName.valueOf("Abd");
                    QName codeType = QName.valueOf("codeType");
                    QName codeId = QName.valueOf("codeId");
                    QName geoLat = QName.valueOf("geoLat");
                    QName geoLong = QName.valueOf("geoLong");
                    QName geoLatCen = QName.valueOf("geoLatCen");
                    QName geoLongCen = QName.valueOf("geoLongCen");
                    QName valRadius = QName.valueOf("valRadius");
                    QName uomRadius = QName.valueOf("uomRadius");
     
                    StringBuilder sb = new StringBuilder();
                    /*StringBuilder abdsb = new StringBuilder();*/
                    StringBuilder avxsb = new StringBuilder();
                    StringBuilder circlesb = new StringBuilder();
    		int zone=0;
                    /*int coord=0;*/
    		XMLInputFactory f = XMLInputFactory.newInstance();
    		try {
    			try(Reader reader = Files.newBufferedReader(Paths.get(fichier))) {
     
    				XMLStreamReader xmlreader = f.createXMLStreamReader( reader);
    				while(xmlreader.hasNext()) {
    				    switch(xmlreader.next()) {
    				    case XMLEvent.START_ELEMENT:
    				    	if ( abd.equals(xmlreader.getName()) ) {
                                                avxsb.append("--------------------------\n"); // rajoute des pointillés pour delimiter chaque zones
                                                avxsb.append("Zone ").append(zone++)/*.append("\n")*/;
    						    boolean grabtext=false;
    							readavx: while(xmlreader.hasNext()) {
    								switch(xmlreader.next()) {
    							    case XMLEvent.START_ELEMENT:
                                                                    if ( codeType.equals(xmlreader.getName()) ) {
                                                                            avxsb.append("\n").append("\n").append(" codeType: ");
                                                                            grabtext = true;
                                                                     }
                                                                    else if ( codeId.equals(xmlreader.getName()) ) {
                                                                            avxsb.append("\n").append("\n").append(" nom: ");
                                                                            grabtext = true;
    							    	}
                                                                    else if ( geoLat.equals(xmlreader.getName()) ) {
                                                                            avxsb.append("\n").append(" Coord:  ");
                                                                            grabtext = true;
     
    							    	}
                                                                    else if ( geoLong.equals(xmlreader.getName()) ) {
                                                                            circlesb.append(" long: ");
                                                                            grabtext = true;
     
    							    	}
                                                                    else if ( geoLatCen.equals(xmlreader.getName()) ) {
                                                                            avxsb.append("\n").append(" Circle coordinate center : ");
                                                                            grabtext = true;
     
    							    	}
                                                                    else if ( geoLongCen.equals(xmlreader.getName()) ) {
                                                                            circlesb.append(" LongCen: ");
                                                                            grabtext = true;
     
    							    	}
                                                                    else if ( valRadius.equals(xmlreader.getName()) ) {
                                                                            avxsb.append(" Radius : ");
                                                                            grabtext = true;
     
    							    	}
                                                                    else if ( uomRadius.equals(xmlreader.getName()) ) {
                                                                            circlesb.append("\n").append(" unité  : ");
                                                                            grabtext = true;
     
    							    	}
     
                                                                    else { 
                                                                            grabtext = false;
                                                                            avxsb.append("\n");
    							    	}
    							    	break;
    							    case XMLEvent.END_ELEMENT:
                                                                            grabtext=false;
    							    	if ( abd.equals(xmlreader.getName())) {
                                                                            if ( sb.length()>0 ) sb.append("\n");
                                                                            sb.append("\n").append(avxsb);
                                                                            avxsb.setLength(0);
     
                                                                            break readavx;
    							    	}
    							    	break;
    							    case XMLEvent.CHARACTERS:
    							    	if ( grabtext ) {
                                                                            avxsb.append(xmlreader.getText());
                                                                            /*circlesb.append(xmlreader.getText());*/
    							    	}
    							    	break;
    							    }
    							}
    				    	}
    				    }
    				}
    			}
     
    			System.out.println(sb);
     
    			// pour écrire dans un fichier :
     
    			//Files.writeString(Paths.get("/Users/moi/Desktop/xxxxxxx.txt"), sb.toString());
                            /*try(PrintWriter printWriter = new PrintWriter(Files.newBufferedWriter(Paths.get("/Users/moi/Desktop/xxxxxxx.txt")))) {
                            printWriter.println(sb);*/
     
                        } catch (XMLStreamException | IOException e) {
    			e.printStackTrace();
    		}
                }
    }
    En gros je souhaite ajouter une conditions a ce code du style :
    Si dans le tags <AbdUid> puis <AseUid> la valeur de <codeType> est R ou P ou D-OTHER continue le code sinon passe au prochain <Abd>

    Mes connaissances étant proches du néant, je m'en remets donc a vous.
    Par avance merci pour votre aide et prenez soin de vous et vos proches.

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 084
    Points : 7 995
    Points
    7 995
    Par défaut
    Tu auras peut être plus facile de faire cela avec XPath. https://zedros.developpez.com/tutoriels/java/xml/xpath/

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 150
    Points : 45
    Points
    45
    Par défaut
    merci pour votre réponse was cependant il semble que dans la partie qui pourrait m'intéresser il y a une erreur (du moins a en croire ce que me retourne mon IDE)
    voir en gras ci-dessous (ligne 7 l'accolade est soulignée en rouge)
    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
    //Ajouter cette méthode à la classe JDOM2
    //Remplacer la ligne afficheALL(); par afficheFiltre();
    static void afficheFiltre()
    {
       //On crée un nouveau filtre
       Filter filtre = new Filter()
       {
          //On définit les propriétés du filtre à l'aide
          //de la méthode matches
          public boolean matches(Object ob)
          {
             //1re 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;
    
             //On crée deux variables qui vont nous permettre de vérifier
             //les conditions de nom et de prenom
             int verifNom = 0;
             int verifPrenom = 0;
    
             //2e vérification: on vérifie que le nom est bien "CynO"
             if(element.getChild("nom").getTextTrim().equals("CynO"))
             {
                verifNom = 1;
             }
             //3e vérification: on vérifie que CynO possède un prenom "Laurent"
             //On commence par vérifier que la personne possède un prenom,
             //en effet notre fichier XML possède des étudiants sans prénom !
             Element prenoms = element.getChild("prenoms");
             if(prenoms == null){return false;}
    
             //On constitue une liste avec tous les prenom
             List listprenom = prenoms.getChildren("prenom");
    
             //On effectue la vérification en parcourant notre liste de prenom
             //(voir: 3.1. Parcourir une arborescence)
             Iterator i = listprenom.iterator();
             while(i.hasNext())
             {
                Element courant = (Element)i.next();
                if(courant.getText().equals("Laurent"))
                {
                   verifPrenom = 1;
                }
             }
    
             //Si nos conditions sont remplies on retourne true, false sinon
             if(verifNom == 1 && verifPrenom == 1)
             {
                return true;
             }
             return false;
          }
       };//Fin du filtre
    
       //getContent va utiliser notre filtre pour créer une liste d'étudiants répondant
       //à nos critères.
       List resultat = racine.getContent(filtre);
       //On affiche enfin l'attribut classe de tous les éléments de notre liste
       Iterator i = resultat.iterator();
       while(i.hasNext())
       {
          Element courant = (Element)i.next();
          System.out.println(courant.getAttributeValue("classe"));
       }
    }
    pourriez vous m'aider a solutionné celle-ci svp afin d'en voir le résultat ?

  4. #4
    Modérateur

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

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

    ce n'est pas comme ça qu'on utilise Filter, ce serait trop compliqué.

    Si tu utilises JDOM 2 il vaut mieux se servir tout simplement des streams :

    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
    List<Element> laurents =
      root.getChildren() // tous les éléments enfants de la racine
      .stream() // utilisons l'API stream
      .filter(e -> e.getChildText("nom").equals("CynO")) // garder que ceux qui ont le bon nom
      .filter(e -> // garder que ceux qui contiennent le bon prénom
        e.getChild("prenoms") // pour l'enfant <prenoms>
          .getChildren("prenom") // prendre tous les enfants <prenom>
          .stream() // utilisons l'API stream
          .anyMatch(p -> p.getText().equals("Laurent")) // vérifier s'il y en a un qui est le bon
      )
      .collect(Collectors.toList()); // les mettre dans une List
     
    laurents.forEach(e -> {
      System.out.println(e.getAttributeValue("classe"));
    });

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 150
    Points : 45
    Points
    45
    Par défaut
    Merci pour votre réponse Thelvin, petite précision s'il vous plait, dois-je mettre votre bout de code dans la méthode main ou la deuxième ?

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 564
    Points : 21 629
    Points
    21 629
    Par défaut
    Ah ben pour le même comportement, c'est dans afficheFiltre()

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 150
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Ah ben pour le même comportement, c'est dans afficheFiltre()
    ok mais il me faut créer une variable root ? sinon il me retourne une erreur "cannot find variable root" a la ligne root.getchildren()
    désolé je ne comprends pas trop

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 564
    Points : 21 629
    Points
    21 629
    Par défaut
    Ben, c'était pareil dans le code que tu as montré.

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 150
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Ben, c'était pareil dans le code que tu as montré.
    Du coup ça ne m’aide pas trop 😬

  10. #10
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 084
    Points : 7 995
    Points
    7 995
    Par défaut
    Sais tu que root en français c'est racine ?

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 150
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par wax78 Voir le message
    Sais tu que root en français c'est racine ?
    en effet, après avoir remplacé root par racine les erreurs ont disparues et je peux l'executer. Cependant, le system.out ne retourne rien

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 564
    Points : 21 629
    Points
    21 629
    Par défaut
    Va falloir montrer le programme et le XML.

    Et ç'aurait été intelligent que j'aie pas besoin de le faire remarquer.

  13. #13
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 150
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Va falloir montrer le programme et le XML.

    Et ç'aurait été intelligent que j'aie pas besoin de le faire remarquer.
    Je comprends bien thelvin mais je suis en week end depuis mardi soir. Je le publie début de semaine

Discussions similaires

  1. Calculs sur une colonne pour extraire trois valeurs
    Par sp2308 dans le forum SQLite
    Réponses: 2
    Dernier message: 27/03/2014, 12h47
  2. Réponses: 10
    Dernier message: 07/07/2012, 17h11
  3. [OpenOffice][Tableur] Macro bouton, appliquer une valeur sur plusieurs cellules selectionées
    Par myz-rix dans le forum OpenOffice & LibreOffice
    Réponses: 1
    Dernier message: 23/07/2011, 06h37
  4. [PHP 5.3] Je n'arrive pas à appliquer une valeur sur une AERATEXT (PHP)
    Par beegees dans le forum Langage
    Réponses: 2
    Dernier message: 28/12/2009, 17h18
  5. Réponses: 1
    Dernier message: 12/05/2008, 18h39

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