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 :

Trouver le bon "Element" [JDOM]


Sujet :

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

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 78
    Par défaut Trouver le bon "Element"
    Bonjour,

    Je travaille avec Eclipse et JDOM (enfin j'essaye)
    voici mon problème :

    Je dois mettre à jour le texte d'une balise d'un fichier xml, mais hormis le nom de la balise (type Element), je n'ai aucun autre repère...

    Un exemple pour être un peu plus clair :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <Main>
                   <balise1>
                   </balise1>
                   <balise2>
                        <sousbalise2>
                             <texteSB2>toto</texteSB2>
                        </sousbalise2>
                   </balise2>
              </Main>

    Le problème est que je dois mettre "titi" au lieu de "toto" et la seule indication dont je dispose est le nom de la balise "texteSB2".

    Les tutos et exemples que je trouve se basent toujours sur le nom de la balise "parente" or moi je ne le connais pas...

    Y a-t-il une solution ?

    Merci d'avance

  2. #2
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Filter<Element> filter = Filters.element("texteSB2");
    for(Element monElement : doc.getDescendants(filter)) {
      monElement.setText("titi");
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 78
    Par défaut
    j'ai ajouté ton code et j'ai eu l'erreur suivante :

    "Exception in thread "main" java.util.ConcurrentModificationException: ContentList was modified outside of this Iterator"

  4. #4
    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
    Diable, tu as raison. Du coup ça va être un peu plus chiant.

    - Si tu as un seul élément à modifier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Filter<Element> filter = Filters.element("texteSB2");
    Element monElement = doc.getDescendants(filter).next();
    monElement.setText("titi");
    - Si tu dois modifier plusieurs éléments :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Filter<Element> filter = Filters.element("texteSB2");
    List<Element> mesElements = new ArrayList<Element>();
    for(Element monElement : doc.getDescendants(filter)) {
      mesElements.add(monElement);
    }
    for(Element monElement : mesElements) {
      monElement.setText("titi");
    }
    Autre possibilité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    XPathFactory xpathFactory = XPathFactory.instance();
    XPathExpression<Element> xpath = xpathFactory.compile("//texteSB2", Filters.element());
    for(Element monElement : xpath.evaluate(doc)) {
      monElement.setText("titi");
    }
    Mais pour celle-ci il faut aussi la bibliothèque Jaxen.
    La différence, c'est que les XPathExpression ne renvoient pas une collection "vivante", comme le fait getDescendants(). Autrement dit, XPathExpression s'occupe de faire à notre place la première boucle de mon exemple 2. Il ne reste donc que la deuxième boucle à faire.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 78
    Par défaut
    Un grand merci à toi Thelvin !

    J'ai tout testé sauf l'option XpathFactory et ça marche très bien !!

    Merci encore !!

  6. #6
    Invité de passage
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1
    Par défaut Pour ceux qui rencontreraient le problème
    En se basant sur la méthode static IteratorUtils.toList(Iterator<T>) de l'API Common Collection, vous obtenez une liste altérable d'Element

  7. #7
    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
    Certes, mais il devient rare d'avoir cette bibliothèque dans son projet. Et l'ajouter juste pour ça, bof bof.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

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