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 :

[XML,JAVA] outils ou méthode adéquate [DOM]


Sujet :

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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Par défaut [XML,JAVA] outils ou méthode adéquate
    Bonjour,

    Débutant dans le monde du développement java. J'aurais besoin d'un petit coup de pouce concernant le choix d'outils ou méthode adéquate pour traiter un problème.

    Soit le fichier 'XML' ou 'XSL' ou ce que vous voulez qui fait office de canevas ou feuille de style :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <essai name="GUID{NUMERO_ESSAI}">
       <numero> 3534</numero>
       <commentaire>{COMMENTAIRE}</commentaire>
    </essai>
    je souhaiterais par le biais d'une classe java (simple) définir les variables {NUMERO_ESSAI} et {COMMENTAIRE} afin d'obtenir un nouveau document XML de cette forme:
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <essai name="GUID34567890">
       <numero> 3534</numero>
       <commentaire>Merci de votre aide</commentaire>
    </essai>
    Quelle méthode dois-je mettre en œuvre pour y arriver?

    j'étais parti sur XPath -> variableResolver

    Merci

  2. #2
    Membre Expert

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Par défaut
    String#replace() ?

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Je suis assez d'accord -_-°.

    Si c'est plus embêtant, genre il faut faire attention aux < et aux &, et il y a risque que l'encodage ne soit pas unicode, je ne vois qu'une méthode un peu compliquée :

    - Boucler sur tous les attributs du document (avec un XPath sur n'importe quel attribut, par exemple)
    - Pour chaque attribut, faire un replace() de chaque variable par ce qu'elle représente, et mettre le résultat à la place.

    Puis :

    - Boucler sur tous les nœuds texte du document (avec un XPath sur */text() par exemple)
    - Pour chaque nœud texte, faire la même chose qu'avec les attributs.

    - Enregistrer le résultat avec son sérialiseur XML préféré.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Par défaut
    Merci,

    Des réponses simple et basic... Ca pourrait être envisageable.

    Pour mutualiser les parcours du document XML ou Arbre DOM.
    Est-il possible que lors du parse du document XML ici par DOM, il y est des events générés avant la constitution de l'arbre DOM. Ceci afin de remplacer directement la valeur entre {}. Et d'avoir un un arbre DOM déjà correct.

    Cela éviterait les boucles sur l'ensemble des attributs et l'ensemble du texte.
    Car il ne faut pas oublier que les extraits XML du post original sont des cas extrêmement simplifiés.

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par bobolebrikiller Voir le message
    Pour mutualiser les parcours du document XML ou Arbre DOM.
    Est-il possible que lors du parse du document XML ici par DOM, il y est des events générés avant la constitution de l'arbre DOM. Ceci afin de remplacer directement la valeur entre {}. Et d'avoir un un arbre DOM déjà correct.
    Je ne connais rien qui fasse ça directement, mais c'est peut-être parce que je ne connais pas.
    Ce que tu peux faire, c'est de créer ton propre SAX Parser Factory, qui génère des parseurs SAX, reposant eux-même sur un parseur SAX officiel, interceptant ses évènements, modifiant à la volée les attributs et le texte, et signalant l'événement ainsi modifié.

    Citation Envoyé par bobolebrikiller Voir le message
    Cela éviterait les boucles sur l'ensemble des attributs et l'ensemble du texte.
    Car il ne faut pas oublier que les extraits XML du post original sont des cas extrêmement simplifiés.
    On parle de quelle taille réélle, là ? 5000 lignes ? 10000 lignes ? Si c'est dans cet ordre ou moins, tu t'en fiche des boucles, c'est largement assez rapide.
    (Bon, si on est en embarqué c'est une autre histoire... Mais je ne ferais pas ce genre de travail sur de l'embarqué.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Par défaut
    Avec vos conseilles voila ce que ca donne.

    Donc je parcours l'ensemble de l'arbre DOM 1 fois et je recherche les {} dans le texte et les attributs.


    Si vous avez des commentaires ou améliorations (constructifs):


    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
     
        private static Map<String,String> listParam = null;
     
        public static Document response(final Document doc, Map<String,String> list) {
     
            listParam = list;
            TreeWalker walker = createTreeWalker(doc);
            walker = paramResolver(walker);
            doc.replaceChild((Node)walker.getRoot(),doc.getDocumentElement());
     
            return doc;
     
        }
     
        //Fonction de parcours de l'arbre DOM
        private static final TreeWalker paramResolver(TreeWalker walker) {
     
            //noeud courant
            Node parend = walker.getCurrentNode();
            NamedNodeMap listAtt= null;
            //noeuds enfants
            Node n = null ;
            boolean child = false;
            for ( n = walker.firstChild(); n != null; n = walker.nextSibling()) {
                child = true;
                paramResolver(walker);
            }
     
            if (!child) {
                //indique les paramètres dans le text
                parend.setTextContent(replaceParameter(parend.getTextContent()));
            }
     
            //indique les paramètres dans les attributs
            if (parend.hasAttributes()) {
                listAtt = parend.getAttributes();
                for (int i = 0; i< listAtt.getLength(); i++) {
                    listAtt.item(i).setNodeValue(replaceParameter(listAtt.item(i).getNodeValue()));
                }
            }
     
            //retourne la position courante
            walker.setCurrentNode(parend);
     
            return walker;
        }
     
        //Fonction remplaçant les paramètres dans le String
        private static String replaceParameter(String content) {
     
            Pattern p = Pattern.compile("\\{.*\\}");
            String key;
            Matcher matcher =null;
            int count = 0;
            matcher = p.matcher(content); 
            count = 0;
            while(matcher.find()) {
                count++;
                key = matcher.group().replaceAll("\\{", "").replaceAll("\\}", "");
                //si present dans la liste remplace par le param
                if(listParam.containsKey(key)) {
                    content = content.replace(matcher.group(),listParam.get(key));
                }
            }
            return content;
        }
     
     
        private static TreeWalker createTreeWalker(Document doc) {
     
            DocumentTraversal traversal = (DocumentTraversal) doc;
     
            TreeWalker walker = traversal.createTreeWalker(
                    doc.getDocumentElement(), NodeFilter.SHOW_ELEMENT, null, true);
     
            walker.setCurrentNode(walker.getRoot());
            return walker;
        }

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

Discussions similaires

  1. [xml][Java] Comment valider un fichier XML?
    Par ederf dans le forum Valider
    Réponses: 1
    Dernier message: 06/03/2006, 15h51
  2. Réponses: 2
    Dernier message: 02/02/2006, 23h00
  3. XML , java et Gui: débutant
    Par tomsoyer dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 02/12/2005, 10h23
  4. [XML][Java] parser plusieurs fichiers en un seul arbre DOM ?
    Par mrlenul dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 29/11/2005, 11h09
  5. [XML/Java] Serialiser un fichier XML
    Par P4dre dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 03/08/2005, 14h41

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