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

Java Discussion :

Récupération de valeurs de balises après filtrage de contenu


Sujet :

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 Récupération de valeurs de balises après filtrage de contenu
    Bonjour,

    je reposte mon sujet car pas de réponse depuis des lustres.

    j'ai grâce à votre aide pu avancer dans un projet.
    Mon code me permet de récupérer le texte entre des balises, sauf que je désire maintenant appliquer un filtre à celui-ci comme suit:

    Je souhaite récupérer juste l'ensemble du texte entre balise <PRE> si celle-ci contient le mot "QOBCE". comment pourrais-je faire s'il vous plait ?

    voici l'exemple de xml dans lequel j'ai mis en gras le mot qui, s'il est présent fait que mon code me remonte tout le texte entre les balise ouvrante/fermante <PRE>

    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
    <PRE>
    P0695/20 NOTAMN
    Q) LFFF/QOBAW/IV/M  /E /000/006/4940N00327E001
    A) LFFF B) 2002260844 C) PERM
    E) MEASURE MAST NR02087 AT VERSIGNY AISNE WITHDRAWN 
    PSN : 494007N 0032706E
    CREATED: 26 Feb 2020 08:45:00 
    SOURCE: EUECYIYN
    </PRE>
    <PRE>
    P0676/20 NOTAMN
    Q) LFFF/QOBCE/IV/M  /E /000/013/4634N00259E001
    A) LFFF B) 2002241539 C) PERM
    E) MEASURE MAST RDL169/8.5NM LFJU AD : 
    PSN : 463423N 0025857E 
    HEIGHT : 334FT 
    ELEV : 1213FT 
    LIGHTING : DAY AND NIGHT
    CREATED: 24 Feb 2020 15:39:00 
    SOURCE: EUECYIYN
    </PRE>
    <PRE>
    P0662/20 NOTAMN
    Q) LFFF/QOLAS/IV/M  /E /000/010/4909N00315E001
    A) LFFF B) 2002211649 C) 2003210800
    E) OBST NR E0229 LIGHTS OUT OF SERVICE (2 OUT OF 8 WIND TURBINES)
    PSN : 490903N 0031449E
    HEIGHT : 427FT
    ELEV: 984FT
    CREATED: 21 Feb 2020 16:51:00 
    SOURCE: EUECYIYN
    </PRE>
    le code Java ci-dessous me permet de récupérer toute les valeurs entre les balises (et d'une certaine manière me convient très bien).
    Sauf que dans mon évolution, j'ai vu qu'à l'aide de regex je peux appliquer un filtre (j'ai pu lire ça dans un tuto).
    Par conséquent je souhaiterais savoir à quel moment je dois appliquer ce filtre.
    voici ci-dessous 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
     
    package extraction_xml;
     
    import java.io.*;
    import javax.xml.xpath.*;
    import org.w3c.dom.Document;
    import org.xml.sax.SAXException;
    import javax.xml.namespace.*; 
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
     
    public class Extraction_avec_filtre {
     
    	static File fichier;
     
    	// Constructeur 
    	public Extraction_avec_filtre (String url){
    		fichier = new File(url);
    	}
     
    	// Méthodes 
    	/**
             * créer une instance de XPath et lui faire évaluer une XPathExpression
         * @param file
         * @param expression
         * @param retour
         * @return 
             */
    	public String evaluerDOM(File file, String expression, QName retour){
    		String texteCopie=null;
     
    		try{
    			DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
    			DocumentBuilder constructeur = docBuilderFactory.newDocumentBuilder();
    			Document document = constructeur.parse(file);
     
    			//création du XPath 
    			XPathFactory fabrique = XPathFactory.newInstance();
    			XPath xpath = fabrique.newXPath();
     
    			//évaluation de l'expression XPath
    			XPathExpression exp = xpath.compile(expression);
    			NodeList resultat = (NodeList) exp.evaluate(document,XPathConstants.NODESET); // récupère la liste de Node correspondant au xpath (donc des pre)
     
    			StringBuilder sb=new StringBuilder(); // pour faire la concaténation
    			for(int i=0; i<resultat.getLength(); i++) { // parcours
    				if ( i!=0 ) { // pour avoir des séparations entre chaque node, sauf pour le premier
                                        sb.append("\n--------------------------\n");//ajout d'une ligne de séparation par exemple
                                        //sb.append("\n"); // ajoute une ligne vide 
    				}
     
                                    //sb.append("Ligne ").append(i+1).append("\n");//ajout d'un titre par exemple
                                    sb.append("\n");//ajout d'une ligne de séparation par exemple
    				Node pre = resultat.item(i); // on récupère le node d'index i 
    				sb.append(pre.getTextContent()); // concaténation du texte du node
    			}
     
    			texteCopie=sb.toString(); // 
    		}catch(XPathExpressionException xpee){
    			xpee.printStackTrace();
    		} catch (ParserConfigurationException e) {
    			e.printStackTrace();
    		} catch (SAXException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		return texteCopie;
    	}
     
    	/**
             * @param args
             */
    	public static void main(String[] args) throws IOException {
    		Extraction test = new Extraction("/Users/moi/Desktop/testNOTAM/MonFichier.xml");
    		String resultat = test.evaluerDOM(fichier, "//PRE", XPathConstants.STRING);
     
                   /* File Notams = new File("/Users/moi/Desktop/notams_test.txt") ;
                try (PrintWriter out = new PrintWriter(new FileWriter(Notams))) {
                    out.write(resultat) ; //écris bonjour dans le fichier
                    out.println(); //fais un retour à la ligne dans le fichier
                    out.close() ; //Ferme le flux du fichier, sauvegardant ainsi les données.*/
                    System.out.println(resultat);
                } 
    	}
     
    /*}*/
    Dois-je utiliser dans le string builder mon filtre???
    Je vous avoue avoir de grosses difficultés...
    Par avance merci pour votre aide

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 104
    Points : 140
    Points
    140
    Par défaut
    Bonjour,
    Il me semble qu'il suffit de tester la présence de la chaine recherchée dans pre.getTextContent() et de n'appeler sb.append que si c'est bien le cas.
    Pas besoin de regex !

  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 Pk, mais comment tu fais pour tester la chaine de caractères?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 104
    Points : 140
    Points
    140
    Par défaut
    C'est le B.A.BA.
    pre.getTextContent() retourne une valeur de type String.
    Le type String dispose d'une méthode contains.
    Il suffit de l'utiliser pour tester si "QOBCE" est présent dans cette valeur.

  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 Pk960 pour ton aide et précision.

    Je te rejoins sur le fait que c'est le B.A.BA, seulement autodidacte que je suis, mes bases ne sont pas du tout consolidées et comme il peut être constaté j'ai besoin d'aide parfois.

    Néanmoins, sur tes indications, et un peu plus de recherche et de test de mon côté, je suis arrivé a cette modification qui me permet d'atteindre mon but (temporairement cependant dans l'attente d'une nouvelle idée qui me viendrait).

    voici ce que j'ai donc fait (et si vous y voyez un axe d'amélioration je suis aussi preneur :-))


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    String obs1= "QOBCE"; 
    String obs2= "QOLAS";
     
    			for(int i=0; i<resultat.getLength(); i++ ) { // parcours
     
                                    Node pre = resultat.item(i); // on récupère le node d'index i 
                                    if (pre.getTextContent().contains(obs1 )|| pre.getTextContent().contains(obs2 )){//teste si le mot QOBCE ou QOLAS est présent
                                        sb.append("\n");//ajout d'une ligne de séparation
    				sb.append(pre.getTextContent()); // concaténation du texte du node
                                    sb.append("\n");//ajout d'une ligne de séparation
                                    }
    avec ça j'obtiens en sortie ce que je souhaite

    merci pour votre aide

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

Discussions similaires

  1. récupération de valeurs de balises aprés filtrage de contenu
    Par K2carca dans le forum Général Java
    Réponses: 0
    Dernier message: 18/03/2020, 17h11
  2. [JAVA][XML] récupérer des valeurs de balises après filtrage
    Par K2carca dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 15/03/2020, 17h44
  3. [XL-2013] Erreur dans la récupération des valeurs de cellule après un tri dans combobox
    Par Seb86 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 02/06/2018, 16h14
  4. [C#]Récupération de valeurs après un postback
    Par vin100H dans le forum ASP.NET
    Réponses: 13
    Dernier message: 22/08/2007, 12h02
  5. [MySQL] syntaxe variable lors d'une récupération de valeurs après mysql
    Par mussara dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 06/11/2006, 13h30

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