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 :

recherche dans un xml


Sujet :

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

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 98
    Points
    98
    Par défaut recherche dans un xml
    Bonjour tout le monde!!

    Voilà le topo :

    J'ai un document word que j'enregistre en xml word 2003, avec l'arborescence suivante :"WordCout./COUT_MODELE.xml


    Ce que je veux faire, c'est trouver le code correspondant à une ligne de mon document word sachant que cette ligne doit contenir une certaine balise.

    Je ne peux pas me contenter de remplacer la balise par sa valeur, car en fait la balise doit être remplacée par une liste de string, et donc j'ai besoin du code qui permet de creer toute une ligne.

    bref je cherche un truc du genre qui commence par <w:p wsp qui fini par </w:p> et qui contient ma balise.

    J'ai donc fait une méthode qui me lit mon xml et qui m'en fait un String, puis je cherche dans mon string.

    voici ma méthode:

    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
    public static String trouverLigneAvec(String fichier,String element){
     
    		String st = "";
    		try {
    			BufferedReader br= new BufferedReader(new FileReader(fichier));
    			while(br.ready()) {
    				st+=br.readLine();
    			}
    			br.close();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		String gLigne = st.substring(st.indexOf("<w:p wsp"),st.length());
    		String ligne = gLigne.substring(0, gLigne.indexOf("</w:p>")+6);
    		while(!ligne.contains(element)){
    			gLigne = gLigne.replaceAll(ligne,"");
    			ligne = gLigne.substring(0,gLigne.indexOf("</w:p>")+6);
    		}
    		return ligne;
    	}
    gLigne désigne tout le string dans lequel je n'ai pas encore cherché, ligne désigne le string dans lequel je cherche.
    Au fur et à mesure que j'avance dans ma recherche je raccourci gLigne.

    Le pb c'est que cette méthode ne marche pas toujours, notamment quand je fais :

    ligneTASSEAUX_MP = trouverLigneAvec("WordCout./COUT_MODELE.xml","BaliseM");

    il reste bloqué dans la boucle while.

    Si vous avez une idée, merci bcp.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut
    Le mieux est d'utiliser un parser XML, ça sera plus lent mais à la fois plus simple et plus fiable.

    Il existe deux types de parser (en fait trois, mais je ne connais pas bien le troisième) :
    -SAXParser
    -DOMBuilder

    Tu trouveras une implémentation de ces deux types de parser dans la librairie standard sous le package javax.xml.parsers.

    Si tu veux seulement lire ton fichier xml, le plus simple est d'utiliser SAX. Par contre, comme tu as des namespaces dans ton xml, il faut que le spécifies au factory :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SAXParserFactory factory = SAXParserFactory.newInstance();
    factory.setNamespaceAware(false);
     
    SAXParser parser = factory.newSAXParser();
     
    parser.parse(swg, handler);
    Dans ce cas, c'est le handler qui te permettra de catcher l'évènement correspondant à la balise que tu recherches.

    Si tu as besoins de modifier ton fichier xml, il vaut mieux passer par un DOM. Il faudra alors explorer le DOM ou utiliser XPath pour rechercher ta balise.

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 98
    Points
    98
    Par défaut
    Merci de ta réponse, mais en fait j'ai pas trop envie de toucher au DOM et au SAX, c'était ma toute première approche du pb, mais après y avoir passé plusieurs heures j'avais toujours rien. Pourtant Tout le monde me disait que c'était ça qu'il fallait utiliser. Au bout d'un moment j'ai demandé de l'aide à un prof, mais sans lui spécifier que j'avais des pbs avec dom, je lui ai juste dit que je voulais chercher une balise dans un xml et la remplacer par sa valeur.
    Il m'a conseillé le bon vieux String.replaceAll que j'avais complétement oublié, et avec ça j'ai fait pas mal de truc qui marche bien.

    Bon, c'est vrai que quand il faut faire plusieurs lignes c'est un peu plus chiant, mais j'y arrive très bien en le faisant à la main. C'est à dire en cherchant dans le code xml le ligne que veux remplacer et l'y mettant plusieurs fois. Le pb de cette méthode c'est que dès que je touche à mon modéle. je passe un truc en gras par exemple, et bien la ligne n'est plus la même et il faut se recogner tout le code xml ce qui est super mais alors super chiant. même avec le ctrl + F,

    Bref je me suis dit qu'il faudrait pouvoir trouver cette ligne de manière automatique, je fais ma petite méthode toute gentille, et paf ça marche, enfin presque... Parfois ça ne marche pas.

    Plutôt que de farfouiller dans un librairie à laquelle je pige rien du tout, je préférerais corriger la petite faute qu'il doit y avoir dans ma méthode, comme ça je comprendrait tout ce qui se passe.

    En plus, mon xml, c'est juste un word, et je crois que dom et sax sont fait pour des trucs plus compliqué, j'ai notamment entendu parler d'arbre de racine ou d'autres truc comme ça et là je comprend plus.


    Donc voilà, merci de ton conseil, mais j'aimerais vraiment mieux le faire à la main.

    Alors est ce que tu vois ce qui cloche dans cette méthode?

  4. #4
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 98
    Points
    98
    Par défaut
    Il semblearit que ce qui clochait c'était mes balises, je suis pas encore sûr mais quand je remplace CoutTotal par COTT, par exemple, ça a l'air de bien marcher.

  5. #5
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 98
    Points
    98
    Par défaut
    Non en fait le problème était le signe + en début de ligne.

    Va savoir pourquoi ?

    Si quelqu'un a une idée, ça me plairait de savoir

  6. #6
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 502
    Points
    15 502
    Par défaut
    Ton problème viens du fait que tu t'attends à ce que replaceAll() remplace simplement la chaine de caractère de la variable ligne par "". Pour cela tu doit utiliser replace();

    replaceAll() travaille avec des expression rationnelles et non pas seulement des chaines de caractères. Dans une expression rationelle certains caractères ont une signification particulière. Par exemple, ton + ne signifie pas '+' mais que le caractère précédent(ou le groupe précédent) doit être présent une fois ou plus.

    Je te conseille de te renseigner sur les expressions rationnelles. Elles devraient te permettre de résoudre ton problème de manière plus simple. Regardes la classe java.util.Pattern de la javadoc ou un tutoriel plus complet sur le sujet.

  7. #7
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 98
    Points
    98
    Par défaut
    Si on suppose que la balise à remplacer ne soit présente qu'une seule fois, alors je peux utiliser aussi bien replace que replaceAll, la seule différence étant alors que replace ne va pas poser de problème avec les + ??

    En fait c'est mon cas dans le cas particulier ou les + posaient problème donc s'il suffit de remplacer replaceAll par replace, c'est cool.

    J'ai bien compris?

    Merci

  8. #8
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 502
    Points
    15 502
    Par défaut
    En effet a noter que le public replace(CharSequence target, CharSequence replacement) n'est disponible que depuis java 1.5

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

Discussions similaires

  1. recherche dans fichier xml
    Par hichamland dans le forum Langage
    Réponses: 6
    Dernier message: 02/05/2009, 15h58
  2. [XPATH] génération d'un xpath pour faire des recherches dans un xml
    Par Spaceman Spiff dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 11/06/2007, 18h18
  3. Recherche dans fichier xml
    Par sandytarit dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 19/03/2007, 10h28
  4. recherche dans fichier xml
    Par piro dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/03/2006, 08h11
  5. Réponses: 4
    Dernier message: 28/10/2005, 09h59

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