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

  1. ###raw>post.musername###
    Membre du Club
    Récupération du texte entre 2 tags xml pour creation d'un fichier texte
    Bonjour,

    je suis sur la finalisation d'un projet pour mon travail qui consiste a récupérer des données sur des sites particulier afin des les injecter dans un système.
    ce système n'accepte que le fichier texte.
    mon projet m'obtiens le resultat sous forme xml.
    je dois donc récupérer les valeurs du texte entre 2 balises de mon xml pour créer mon fichier texte.

    pour le moment de bric et de broc, j'arrive a lire entre ce fameux tag (si j'en crois le résultat dans ma console). Cependant j'obtiens que 2 résultats la ou mon fichier xml m'en donne beaucoup plus.

    enfin je ne sais pas comment créer mon fichier texte a l'issue.

    pourriez vous m'aider s'il vous plait, ou a defaut m'orienter vers la solution ?

    je vous mon fichier xml dans lequel je souhaite récupérer mon texte (a titre d'exemple car il peut être bcp plus grand en taille



    et ci après le code que j'utilise sachant que je l'ai récupéré par ici et un peu agrémente a ma sauce (ma sauce de super novice )

    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
     
     
    package notams;
     
     
     
    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;
     
    public class Extraction {
     
    	static File fichier;
     
    	// Constructeur 
    	public Extraction (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);
    			Object resultat = exp.evaluate(document,retour);
    			System.out.println(resultat);
    			texteCopie=(String) resultat;
    		}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) {
    		Extraction test = new Extraction("C:\\Users\\moi\\Desktop\\MonFichier.xml");
    		String resultat = test.evaluerDOM(fichier, "//PRE", XPathConstants.STRING);
    		System.out.println(resultat);
    	}
     
    }


    dernière petite question, comment puis je mettre une ligne supplémentaire entre 2 résultats

    par avance merci pour votre aide
      0  0

  2. #2
    Modérateur

    Salut,

    Au lieu de demander le résultat du xpath en String, demande le en NodeSet (tu obtiendras un org.w3c.dom.NodeList), que tu parcourras, ce qui te permettra d'ajouter entre chaque pre (classe org.w3c.dom.Node) le texte que tu veux, en utilisant un StringBuilder pour faire la concaténation :

    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
    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(); // récupération de la String résultat
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre du Club
    ok je vois merci encore Joel, mais ou dois je rentrer l'instruction de creer mon fichier texte car mon resultat apparait dans la console pour l'instant et je souhaite un fichier texte au final.

    dois je le mettre en lieu et place de
    System.out.print ln(resultat) dans ma class main ou alors a la pace ded la ligne
    texteCopie=sb.toString(); ?

    j'ai du mal a voir

  4. ###raw>post.musername###
    Membre du Club
    c'est bon j'ai trouvé réponse a mon problème.
    je vous remercie grandement Joel.
    Vous m'avez été encore une fois d'une grande aide sur ce projet

    voici mon code au final

    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 extractraction2;
     
     
     
    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 Extraction2 {
     
    	static File fichier;
     
    	// Constructeur 
    	public Extraction2 (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 {
    		Extraction2 test = new Extraction2("C:\\Users\\moi\\Desktop\\MonFichier.xml");
    		String resultat = test.evaluerDOM(fichier, "//PRE", XPathConstants.STRING);
     
                    File Notams = new File("C:\\Users\\moi\\Desktop\\Notams FIR.txt") ;
                    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.
    	}
     
    }


    bon apres j'imagine bien que je peux l'ameliorer encore
    d'ailleurs un des axes d'amelioration serait qu'a la fin, une fois mon txt creer je supprime mon fichier xml
      0  0