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 :

Suppression problématique [JDOM]


Sujet :

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

  1. #1
    Membre averti Avatar de Tux++
    Étudiant
    Inscrit en
    avril 2008
    Messages
    281
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2008
    Messages : 281
    Points : 379
    Points
    379
    Par défaut Suppression problématique
    Bonjour,

    j'ai actuellement (notamment) un fichier de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?xml version="1.0" encoding="UTF-8"?>
    <Utilisateur>
    <Information>
    <Name>user</Name>
    <Login>login</Login>
    <Ip>127.0.0.1</Ip>
    </Information>
    </Utilisateur>
    La modification, l'ajout se passent sans problèmes via JDOM mais j'ai des problèmes pour la suppression.

    Je sais qu'il y a déjà des topics à ce sujet, et une partie dans la faq mais le problème persiste.

    Imaginons que je veux supprimer un noeud <Information></Information> complet lorsque Name=user par exemple.

    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
        public void supprElement(String element, User u, String f) {
            //REQUIRES: u non-NULL
            //MODIFIES: this
            //EFFECTS:  Supprime la balise "element" correspondant a "u.login"
     
            documentRoot_ = super.getDocumentRoot();
            List listEtudiant = documentRoot_.getChildren("Information");
            Iterator i = listEtudiant.iterator();
     
            while (i.hasNext()) {
                Element courant = (Element) i.next();
                if(courant.getChild(element)!=null && courant.getChild("Name")!=null) {
                if (courant.getChild("Name").getValue().equals(u.getName())) {
                    courant.removeContent();  
                }
                }
            }            
            recordFile(f);
        }
    Si j'exécute ce code il reste ceci à la fin :


    <?xml version="1.0" encoding="UTF-8"?>
    <Utilisateur>
    <Information/>
    </Utilisateur>

    pourquoi ce "<Information/>" (qui fait tout planter...)


    j'ai essayé aussi en supprimant élément par élément et même avec un Filter, même problème...


    une idée?


    merci
    Certified Oracle Advanced PL/SQL Professional
    Certified Oracle APEX Expert
    Certified Oracle SQL Expert

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    octobre 2005
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2005
    Messages : 104
    Points : 140
    Points
    140
    Par défaut
    Bonjour,
    L'instruction "courant.removeContent();" supprime le contenu de l'élément courant qui est un élément <information>.
    Il faudrait supprimer l'élement <information> lui-même et non son contenu.

  3. #3
    Membre actif Avatar de jiddou
    Inscrit en
    août 2007
    Messages
    247
    Détails du profil
    Informations forums :
    Inscription : août 2007
    Messages : 247
    Points : 251
    Points
    251
    Par défaut
    removeContent comme son nom l'indique supprime le contenu d'un élément donc tout les éléments fils mais pas l'élément en question.
    Donc essaies de le supprimer de son parent avec removeChild ou removeChildren.
    Excuses moi de ne pas être si clair c'est parce que je n'ai jamais manipuler jdom d'habitude je me contente des packages de java (javax.xml) mais l'algo reste le même.
    En plus ce que tu essaies de faire est très facile avec xpath et plus pratique.

  4. #4
    Membre averti Avatar de Tux++
    Étudiant
    Inscrit en
    avril 2008
    Messages
    281
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2008
    Messages : 281
    Points : 379
    Points
    379
    Par défaut
    En fait à la base je n'utilisais que les removeChild() et removeChildren() mais le problème restait le même...

    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
        public void supprElement(String element, User u, String f) {
            //REQUIRES: u non-NULL
            //MODIFIES: this
            //EFFECTS:  Supprime la balise "element" correspondant a "u.login"
     
            documentRoot_ = super.getDocumentRoot();
            List listEtudiant = documentRoot_.getChildren("Information");
            Iterator i = listEtudiant.iterator();
     
            while (i.hasNext()) {
                Element courant = (Element) i.next();
                if(courant.getChild(element)!=null && courant.getChild("Name")!=null) {
                if (courant.getChild("Name").getValue().equals(u.getName())) {
                    courant.removeChild("Name");
                    courant.removeChild("Login");
                    courant.removeChild("Ip");
                }
                }
            }            
            documentRoot_.removeChild("Information");
            recordFile(f);
        }
    là j'ai le problème cité ua début

    ou encore

    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
        public void supprElement(String element, User u, String f) {
            //REQUIRES: u non-NULL
            //MODIFIES: this
            //EFFECTS:  Supprime la balise "element" correspondant a "u.login"
     
            documentRoot_ = super.getDocumentRoot();
            List listEtudiant = documentRoot_.getChildren("Information");
            Iterator i = listEtudiant.iterator();
     
            while (i.hasNext()) {
                Element courant = (Element) i.next();
                if(courant.getChild(element)!=null && courant.getChild("Name")!=null) {
                if (courant.getChild("Name").getValue().equals(u.getName())) {
                    documentRoot_.removeChild("Information");
                }
                }
            }            
            recordFile(f);
        }
    là j'ai une exception de concurrence de modification


    merci de vos réponses
    Certified Oracle Advanced PL/SQL Professional
    Certified Oracle APEX Expert
    Certified Oracle SQL Expert

  5. #5
    Membre actif Avatar de jiddou
    Inscrit en
    août 2007
    Messages
    247
    Détails du profil
    Informations forums :
    Inscription : août 2007
    Messages : 247
    Points : 251
    Points
    251
    Par défaut
    et si tu le supprimais de la list listEtudiant .

  6. #6
    Membre averti Avatar de Tux++
    Étudiant
    Inscrit en
    avril 2008
    Messages
    281
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2008
    Messages : 281
    Points : 379
    Points
    379
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    java.util.ConcurrentModificationException
    	at org.jdom.ContentList$FilterListIterator.checkConcurrentModification(ContentList.java:940)
    	at org.jdom.ContentList$FilterListIterator.nextIndex(ContentList.java:829)
    	at org.jdom.ContentList$FilterListIterator.hasNext(ContentList.java:785)
    	at PFIL.AdressBook.XmlEditor.supprElement(XmlEditor.java:34)
    	at PFIL.AdressBook.UserSharingModel.delUser(UserSharingModel.java:61)
    	at PFIL.AdressBook.DelUserModel.delUser(DelUserModel.java:19)
    	at PFIL.AdressBook.DelUserController$1.actionPerformed(DelUserController.java:36)
    en faisait listEtudiant.remove(courant);

    je comprends pas trop d'ailleurs, je ne vois pas en quoi j'ai des problèmes de modifications simultanées.
    Certified Oracle Advanced PL/SQL Professional
    Certified Oracle APEX Expert
    Certified Oracle SQL Expert

  7. #7
    Membre actif Avatar de jiddou
    Inscrit en
    août 2007
    Messages
    247
    Détails du profil
    Informations forums :
    Inscription : août 2007
    Messages : 247
    Points : 251
    Points
    251
    Par défaut
    Pourrait tu nous donner la classe de la methode supprime pour faire un petit test.

  8. #8
    Membre averti Avatar de Tux++
    Étudiant
    Inscrit en
    avril 2008
    Messages
    281
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2008
    Messages : 281
    Points : 379
    Points
    379
    Par défaut
    oui, voilà.

    merci de ton temps en tout cas

    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
    package PFIL.AdressBook;
     
    import org.jdom.*;
    import java.util.List;
    import java.util.Iterator;
     
    /**
     *
     * @author ****** Guillaume
     *         ******* Charles
     */
     
    public class XmlEditor extends PFIL.Abstract.XmlEditor {
    //OVERVIEW: Permets la modification/suppression d'un element du fichier XML 
    //                      <documentRef_(documentRoot_)>     
     
        private static Element documentRoot_ = new Element("Utilisateurs");
        private static org.jdom.Document documentRef_ = new Document(documentRoot_);
     
        public XmlEditor() {
     
            super(documentRef_, documentRoot_);
        }
     
        public void supprElement(String element, User u, String f) {
            //REQUIRES: u non-NULL
            //MODIFIES: this
            //EFFECTS:  Supprime la balise "element" correspondant a "u.login"
     
            documentRoot_ = super.getDocumentRoot();
            List listEtudiant = documentRoot_.getChildren("Information");
            Iterator i = listEtudiant.iterator();
     
            while (i.hasNext()) {
                Element courant = (Element) i.next();
                if(courant.getChild(element)!=null && courant.getChild("Name")!=null) {
                if (courant.getChild("Name").getValue().equals(u.getName())) {
                    listEtudiant.remove(courant);
                }
                }
            }            
            recordFile(f);
        }
     
        public void modifElement(String element, String name, String modif) {
            //REQUIRES: u non-NULL
            //MODIFIES: this
            //EFFECTS:  Remplace la balise "element" correspondant a "name" par "modif"
     
            documentRoot_ = super.getDocumentRoot();
            List listEtudiant = documentRoot_.getChildren("Information");
            Iterator i = listEtudiant.iterator();
     
            while (i.hasNext()) {
                Element courant = (Element) i.next();
                if (courant.getChild(element) != null) {
                    if (courant.getChild("Name").getValue().equals(name)) {
                        courant.getChild(element).setText(modif);
                    }
                }
            }
        }
    }
    Certified Oracle Advanced PL/SQL Professional
    Certified Oracle APEX Expert
    Certified Oracle SQL Expert

  9. #9
    Membre actif Avatar de jiddou
    Inscrit en
    août 2007
    Messages
    247
    Détails du profil
    Informations forums :
    Inscription : août 2007
    Messages : 247
    Points : 251
    Points
    251
    Par défaut
    Logiquement je pense que ce n'est pas faisable avec les méthode du genre remove puisque dans ton cas on dois supprimer les éléments parcourus et nom des éléments dedans.Alors à ta place un algorithme un peu différent du tient me tentera. En fait il s'agit de la construction d'un nouveau document sans les élement à supprimer puis ecraser l'ancien.
    Et ta méthode deviendra attention j'ai pas testé donc peut être quelques bugs mais l'idée est là.
    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
            
    public void supprElement(String element, User u, String f) {
        	Element Final = new Element("Utilisateur");
            documentRoot_ = super.getDocumentRoot();
            List listEtudiant = documentRoot_.getChildren("Information");
            Iterator i = listEtudiant.iterator();
     
            while (i.hasNext()) {
                Element courant = (Element) i.next();
                if(courant.getChild(element)!=null && courant.getChild("Name")!=null) {
                if (!courant.getChild("Name").getValue().equals(u.getName())) {
                	Final.addContent(courant);
                }
                }
            }     
    
            documentRoot_ = Final;
            super.setDocumentRoot(Final);
            recordFile(f);
        }
        }

  10. #10
    Membre averti Avatar de Tux++
    Étudiant
    Inscrit en
    avril 2008
    Messages
    281
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2008
    Messages : 281
    Points : 379
    Points
    379
    Par défaut
    ah oui, j'ai compris l'idée


    je vais creuser cela merci
    Certified Oracle Advanced PL/SQL Professional
    Certified Oracle APEX Expert
    Certified Oracle SQL Expert

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

Discussions similaires

  1. Suppression des doublons problématique
    Par crahier dans le forum MS SQL Server
    Réponses: 27
    Dernier message: 22/08/2012, 17h08
  2. [DOM] suppression d'un noeud fils xml en JAVA
    Par alexandre54 dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 20/03/2003, 09h44
  3. Suppression de la contrainte unique
    Par mika dans le forum SQL
    Réponses: 3
    Dernier message: 20/02/2003, 17h56
  4. [CR] suppression du bas de page
    Par grosjej dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 10/09/2002, 08h58
  5. Réponses: 3
    Dernier message: 12/06/2002, 21h15

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