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 :

Rechercher Remplacer efficace, et question StringBuffer


Sujet :

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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2004
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 44
    Par défaut Rechercher Remplacer efficace, et question StringBuffer
    Salut à tous,

    J'ai 2 fichiers, un xml et un xlf. Mon XML content un tag "documentation" qui contient une référence.
    Cette référence correspond à la documentation elle-même contenue dans le XLF.

    Exemple: (XML)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     <object name="Logger">
            <documentation>
    			Logger_desc
            </documentation>
     
           <property name="debugEnabled" type="Boolean">
              <documentation>
              	TWLogger_prop_debugEnabled
              </documentation>
          </property>
    </object>
    Et dans mon XLF:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     <trans-unit id="Logger_desc">
                    <source>Helper class allowing to log errors, warning and debugs to the 'javascript.log'. This class is available as 'log' variable in all javascript fields in BPM.</source>
                </trans-unit>
    Je voudrais remplacer tous mes tag documentation par le texte lui-même et me débarrasser des références.

    Pas trop méchant donc.

    J'ai réussi à réécrire un fichier un peu brisé qui a bien la documentation et plus les références. Mais c'est lent et je réécris régulièrement le début du fichier a cause de mon filereader et mon filewriter que je n'arrive pas à synchroniser.

    J'ai tenté d'utiliser un StringBuffer pour voir si c'était aps plus simple, mais j'ai du mal à piger comment remplacer toutes mes occurrences dedans.

    Un peu de code :

    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
    	public static void main(String[] args) throws XPathExpressionException, ParserConfigurationException, SAXException, IOException {
    		prepareFiles();//ici je parse mes fichiers, ouvre mes reader etc.
    		NodeList references = getDocumentationReferences(ParsedGlobalXml);//je récupère tous mes tag documentations dans mon xml
     
    		//replace each reference by its actual value
    		for (int i = 0; i < references.getLength(); i++) {
    			String reference = references.item(i).getNodeValue().trim();
    			String value = getValue(reference);//je prends la valeur qui correpond à la référence dans le XLF
    			if (value != "Description N/A") {
    				content.toString().replaceAll(reference, value);
    //comment je fais pour gérer un replaceAll dans une boucle sur un StringBuffer?
    			}
    		}
    		Writer.print(content);
    		Writer.close();
    	}
    Mon ancienne méthode pour écrire mes remplacements dans le fichiers de sortie, ca détruit mon XML de base.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private static void replaceReferenceByValue(String reference, String value) throws IOException {
    		Reader = new BufferedReader(new FileReader(Result));
    		String line = null;
    		boolean found = false;
    		while (((line = Reader.readLine()) != null) && !found) {
    			if (line.contains(reference)) {
    				Writer.println(line.replace(reference, value));
    				found = true;
    			} else {
    				Writer.println(line);
    			}
    		}
     
    	}
    J'ai besoin d'un coup de patte dans mon main pour voir si c'est pas mieux avec un StringBuffer et surtout plus rapide.

    Pour ordre d'idée, j'ai 2850 lignes dans mon XML et presque autant dans mon XLF et 556 références à remplacer par leur valeur.

    Récupérer les valeurs dans le XLF est très rapide avec XPath. Mon problème reste pour le remplacement lui-même

    Merci !

  2. #2
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Bonjour,

    Remarques:
    1. Si le document est gros, il vaut mieux éviter d'utiliser DOM. Surtout si le traitement de fichier se parallélise.
    2. content.toString().replaceAll(reference, value); ne fait rien !!! Il crée une nouvelle chaîne partir de ???, ensuite créer encore une nouvelle chaîne en remplacçant des occurences mais tu ne la récupères pas.
    3. L'algorithme avec les FileReader/Writer ne tient pas compte de la structure du XML
    4. Il est préférable d'utiliser StringBuilder plutôt que StringBuffer


    Quelques pistes de solution envisageable:
    1. Pourquoi ne pas le faire par XSL avec une fonction d'extension ?
    2. Utiliser des XMLReader/Writer (XMLStreamReader, XMLEventReader / XMLStreamWriter, XMLEventReader) plutôt que DOM.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  3. #3
    Membre averti
    Inscrit en
    Septembre 2004
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 44
    Par défaut
    Merci pour les commentaires. J'ai quelques questions sur ce que tu conseilles :
    Je me sers d'XSL pour transformer le résultat de mon script en HTML. Ca marche déjà, c'est relativement simple mais je ne vois pas ce que tu appelles fonction d'extension, tu pourrais me donner un lien ou un exemple?
    Ca pourrait ouvrir mon XLF et remplacer mes références dans mon XML?



    J'ai quand même finalement fait un truc qui a l'air de marcher sans me copier plusieurs fois les mêmes infos.
    Je poste la méthode au cas où ça peut aider quelqu'un, c'est une méthode équivalente à replaceAll mais utilisant un stringBuffer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    static String replace(String str, String pattern, String replace) {
    		int s = 0;
    		int e = 0;
    		StringBuffer result = new StringBuffer();
     
    		while ((e = str.indexOf(pattern, s)) >= 0) {
    			result.append(str.substring(s, e));
    			result.append(replace);
    			s = e + pattern.length();
    		}
    		result.append(str.substring(s));
    		return result.toString();
    	}
    C'est relativement rapide, je remplace mes occurrences en 4-5 secondes, ça m'ira. Par contre ça me tue tous mes retours charriots
    Je vais voir s'il y a mieux avec les XMLreaders...

    Merci encore,

    Chato

  4. #4
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Sauf que replaceAll utilise des expression régulières ...

    Le vrai code serait plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Patter p = Pattern.compile(p);
    Matcher m = p.matcher(str);
    StringBuffer s = new StringBuffer();
    while (m.find()) {
      m.appendReplacement(s, replace);
    }
    m.appendTail(s);
    return s.toString();
    Une fonction d'extension est un type de namespace particulier qui permet d'appeler du code Java/C#/C++ durant le parsing. Donc tu peux faire ce que tu veux !
    La déclaration dépend du processeur XSLT utilisé.
    Exemple XALAN
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/06/2009, 17h49
  2. rechercher / remplacer dans fichier en hexa
    Par ratdegout dans le forum C++
    Réponses: 2
    Dernier message: 26/05/2006, 14h14
  3. Comment faire une recherche/remplacement sous Linux
    Par fabszn dans le forum Shell et commandes GNU
    Réponses: 12
    Dernier message: 07/02/2006, 16h38
  4. [Enquete] Recherche développeur Web pour questions
    Par DamienC dans le forum Etudes
    Réponses: 4
    Dernier message: 08/12/2005, 16h21
  5. Rechercher -> remplacer ?
    Par Joul dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/09/2005, 02h03

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