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 :

Problème pour supprimer attribut dans un fichier XML


Sujet :

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

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Points : 85
    Points
    85
    Par défaut Problème pour supprimer attribut dans un fichier XML
    Bonjour à tous !

    Tout est dans le titre ... Non ! Je plaisante mais là je craque ! Ça fait 4 heures que je cherche dans tous les sens (forum, bouqin, etc) et je n'arrive pas à comprendre d'où vient mon maudit problème.

    J'ai un fichier XML qui contient des éléments auxquels sont associés des attributs (cf. ci-dessous) et je souhaiterai supprimer un de ces éléments :

    Exemple l'id 105 mais je n'y arrive pas et ça me G..... !!!!

    Je vous met aussi mon code.

    Je vous remercie d'avance à tous pour votre aide.

    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
     
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <rooms>
    <room id="100" state="available" type="rt1"/>
    <room id="101" state="available" type="rt1"/>
    <room id="102" state="available" type="rt1"/>
    <room id="103" state="available" type="rt1"/>
    <room id="104" state="available" type="rt2"/>
    <room id="105" state="available" type="rt2"/>
    <room id="106" state="available" type="rt2"/>
    <room id="107" state="available" type="rt2"/>
    <room id="200" state="available" type="rt1"/>
    <room id="201" state="available" type="rt1"/>
    <room id="202" state="available" type="rt2"/>
    <room id="203" state="available" type="rt2"/>
    <room id="204" state="available" type="rt3"/>
    <room id="205" state="available" type="rt3"/>
    <room id="206" state="available" type="rt2"/>
    <room id="207" state="available" type="rt3"/>
    <room id="300" state="available" type="rt1"/>
    <room id="301" state="available" type="rt1"/>
    <room id="302" state="available" type="rt2"/>
    <room id="303" state="available" type="rt2"/>
    <room id="304" state="available" type="rt2"/>
    <room id="305" state="available" type="rt2"/>
    <room id="400" state="available" type="rt2"/>
    <room id="401" state="available" type="rt2"/>
    <room id="402" state="available" type="rt2"/>
    <room id="403" state="available" type="rt3"/>
    <room id="404" state="available" type="rt3"/>
    <room id="405" state="available" type="rt3"/>
    <room id="406" state="available" type="rt4"/>
    <room id="407" state="available" type="rt4"/>
    <room id="1000" state="available" type="rt1"/>
    </rooms>
    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
     
            final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
     
            try {
     
                final DocumentBuilder builder = factory.newDocumentBuilder();		
                final Document document= builder.parse(new File(XmlDoc));
     
                NodeList Element = document.getElementsByTagName("room");
     
                if (Element != null && Element.getLength() > 0) {
     
                    for (int i = 0; i < Element.getLength(); i++) {
     
                        Node node = Element.item(i);
                        Element e = (Element) node;
     
                        String id = Element.item(i).getChildNodes().item(0).getNodeValue();
     
     
                        if (id.equals(dataRoom)) {
                            node.getParentNode().removeChild(node);
                         } 
                    }
                }
     
                //Sauvegarde du DOM dans un fichier XML
                transformerXml(document, XmlDoc);
     
            } catch (ParserConfigurationException | SAXException | IOException | DOMException e) {
                //Boîte du message d'erreur
                jop1.showMessageDialog(null, "Erreur durant la suppression d'un client dans le fichier XML\n" + e.toString(), "Erreur", JOptionPane.ERROR_MESSAGE);
            }

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     NodeList Element = document.getElementsByTagName("room");
    Te donne directement une liste d'élements "room" : pas besoin d'aller chercher des éléments enfants dedans pour récupérer l'id, puisque c'est un attribut. C'est Element.getAttribute() pour récupérer un attribut (enfin, si c'est bien org.w3c.dom.Element que tu utilises comme je pense). Ensuite, attention à ne pas continuer à parcourir la NoteList après avoir supprimé l'élément : fait un break, pour arrêter.

    Par ailleurs, utiliser xpath pourrait te simplifier ce type de traitement.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Points : 85
    Points
    85
    Par défaut
    Salut Joël !

    Merci de m'avoir répondu aussi rapidement, effectivement j'utilise org.w3c.dom.Element, je viens de regarder ce que tu m'as noté mais je sais pas trop comment le mettre en place ?

    Si j'écris ce que tu as marqué Element.getAttribute() il m’insulte donc j'ai mis document à la place là il me dit rien mais c'est moi qui ne sait plus quoi faire ...

    Pourquoi c'est si simple pour certains et compliqué pour d'autres ... J'en ai marre !!!

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jb_One73 Voir le message
    Si j'écris ce que tu as marqué Element.getAttribute() il m’insulte donc j'ai mis document à la place là il me dit rien mais c'est moi qui ne sait plus quoi faire ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String id = e.getAttribute("id");
    Tout simplement. Il faut regarder la doc aussi.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Points : 85
    Points
    85
    Par défaut
    Euh ! J'ai écris mon dernier message trop vite je viens de trouver la solution alors je précise quand même que c'est grâce à toi
    Je vais mettre ce que j'ai fait et qui fonctionne correctement (peut-être que cela en aidera d'autres).

    J'ai une autre question mais cette fois ci sur la modification donc je ne sais pas si je peux la mettre dans ce post ?

    Ah ! Oui ! Je voulais apporter une petite précision au break que tu m'as demandé de mettre, en fait je fais une boucle sur une collection qui peut contenir plusieurs éléments à supprimer donc je ne peux pas mettre de break.

    Qu'en penses-tu ?

    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
     
            final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
     
            try {
     
                final DocumentBuilder builder = factory.newDocumentBuilder();		
                final Document document= builder.parse(new File(XmlDoc));
     
                NodeList Element = document.getElementsByTagName("room");
     
                if (Element != null && Element.getLength() > 0) {
     
                    for (int i = 0; i < Element.getLength(); i++) {
     
                        Node node = Element.item(i);
                        Element e = (Element) node;
     
                        String id = e.getAttribute("id");
     
                        if (id.equals(dataRoom)) {
                            node.getParentNode().removeChild(node);
                         } 
                    }
                }
     
                //Sauvegarde du DOM dans un fichier XML
                transformerXml(document, XmlDoc);
     
            } catch (ParserConfigurationException | SAXException | IOException | DOMException e) {
                //Boîte du message d'erreur
                jop1.showMessageDialog(null, "Erreur durant la suppression d'un client dans le fichier XML\n" + e.toString(), "Erreur", JOptionPane.ERROR_MESSAGE);
            }

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Et pour xpath, tu trouveras tout ce qu'il faut ici : http://java.developpez.com/faq/xml/?...uoi-l-utiliser

    Ce qui te permettra d'aller directement chercher l'élément avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    XpathExpression exp = xpath.compile(""/rooms/room[id='"+ dataRoom + "']"); // voir dans la faq comment obtenir cette variable xpath !
    Element roomElement = (Element)exp.evaluate(document,XPathConstants.NODE);
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jb_One73 Voir le message
    J'ai une autre question mais cette fois ci sur la modification donc je ne sais pas si je peux la mettre dans ce post ?
    Vas-y !

    Citation Envoyé par Jb_One73 Voir le message
    Ah ! Oui ! Je voulais apporter une petite précision au break que tu m'as demandé de mettre, en fait je fais une boucle sur une collection qui peut contenir plusieurs éléments à supprimer donc je ne peux pas mettre de break.
    Bizarre...tu veux dire que tu peux avoir plusieurs chambres avec le même id ? (l'exemple avec le xpath ne marche plus dans ce cas, il faut utilise XPathConstants.NODESET, ce qui te donenra un NodeList au lieu d'un Element, qui contiendra que les rooms avec id= dataRoom)

    Sinon, tu peux légèrement alléger le 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
    NodeList roomElements = document.getElementsByTagName("room"); // il y a des conventions de nommage en Java, donc j'ai renommé Element en rooms
    if (roomElements!= null ) {
     
       for (int i = 0; i < roomElements.getLength(); i++) {
     
          Element roomElement = (Element) roomElements.item(i);
     
          String id = roomElement.getAttribute("id");
     
          if (id.equals(dataRoom)) {
             roomElement.getParentNode().removeChild(roomElement );
         } 
     
      }
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Points : 85
    Points
    85
    Par défaut
    Merci pour toutes ses infos, j'en prend bien note une fois mais j'ai commencé avec DOM et j'ai peur de perdre trop de temps "xpath", je ne suis pas retissant mais vu que j'ai pas mal de classe avec .... ??? pour l'avenir je vais m'y investir.

    Mon autre question est cette fois-ci avec la modification, toujours dans le même cas donc j'ai fais ça, ça fonctionne presque bien sauf à la fin il me rajoute le n° de la chambre donc pour que ça soit explicite je met mon code et le résulta obtenu et celui que j'attend.

    Merci pour tout.

    Le 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
            final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
     
            try {
     
                final DocumentBuilder builder = factory.newDocumentBuilder();		
                final Document document= builder.parse(new File(XmlDoc));
     
                for (Iterator<String[]> iterator = dataRoom.iterator(); iterator.hasNext();) {
     
                    String[] next = iterator.next();
     
                    NodeList Element = document.getElementsByTagName("room");
     
                    if (Element != null && Element.getLength() > 0) {
     
                        for (int i = 0; i < Element.getLength(); i++) {
     
                            Node node = Element.item(i);
                            Element e = (Element) node;
     
                            String id = e.getAttribute("id");
     
                            if (id.equals(next[0])) {
     
                                // Element id
                                node.setTextContent(next[0]);
     
                                e.setAttribute("type", next[1]);
                                e.setAttribute("state", next[2]);
                             } 
                        }
                    }
                }
    Le résultat obtenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <room id="100" state="unavailable" type="rt1">100</room>
    Le résultat que j'attend :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <room id="100" state="unavailable" type="rt1"/>

  9. #9
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Bha, c'est le code suivant qui met l'id dans l'élément, sous forme de texte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Element id
    node.setTextContent(next[0]);
    Si tu ne veux pas le faire, enlève cette ligne.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Points : 85
    Points
    85
    Par défaut
    Bonjour Joël !

    Effectivement ta réponse est toute juste ! J'avais indiqué hier que le post était résolu mais j'ai omis de mettre le code final c'est à dire fonctionnel.
    Tu as donc mis le source à ma place et je t'en remercie.

    Encore merci et à très bientôt ;-)

  11. #11
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    À noter que ces classes, le DOM fourni avec Java, sont très compliquées pour tout le monde, c'est pas que toi. Et cette complexité ne sert pas à grand-chose.

    On t'a parlé de XPath pour sélectionner directement l'élément que tu veux,
    moi je vais plutôt de parler de JDOM, pour manipuler du XML facilement en Java. Alors bon, en XML "facile" est une notion toute relative, mais ça reste infiniment plus confortable que le DOM fourni avec Java.

    À réfléchir la prochaine fois que tu travailleras du XML en Java. Pas la peine de se coltiner des mauvais outils.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. [PHP] Problème d'ajout d'attributs dans un fichier xml
    Par sismic dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 10/06/2009, 17h16
  2. comment je pourrais modifier un attribut dans un fichier xml
    Par ryoussef19 dans le forum Visual C++
    Réponses: 6
    Dernier message: 24/08/2007, 14h16
  3. VBScript ASP ET XMLDOM Modification attribut dans un fichier XML
    Par PrinceMaster77 dans le forum VBScript
    Réponses: 12
    Dernier message: 11/06/2007, 06h13
  4. Affecter un attribut dans un fichier XML ou XSL
    Par LLaurent dans le forum XMLRAD
    Réponses: 7
    Dernier message: 05/06/2003, 14h04
  5. Lire un attribut dans un fichier XML en C++
    Par ti.k-nar dans le forum XML
    Réponses: 2
    Dernier message: 14/10/2002, 15h22

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