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 :

[JAVA][XML] récupérer des valeurs de balises après filtrage


Sujet :

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

  1. #1
    Membre du Club
    [JAVA][XML] récupérer des valeurs de balises après filtrage
    Bonjour,

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

    voici l'exemple de 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
    <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 attributs 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
    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);
                } 
    	}
     
    /*}*/


    Par exemple, supposons une fenêtre avec un radio bouton qui me permet de filtrer et de 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 ?
    Dois-je utiliser dans le string builder mon filtre??? Je vous avoue avoir de grosse difficultés...
    Par avance merci pour votre aide

  2. #2
    Membre du Club
    personne pour m'aider s'il vous plait?
    malgré les instructions dans les FAQ/Tuto pas de solutions