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 :

Tester si un élément est vide dans 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 Tester si un élément est vide dans fichier XML
    Bonjour à tous,

    Je cherche à savoir comment je peut savoir si un élément contient bien une valeur. Bien évidemment, j'ai essayé avec les méthodes isEmpty(), equals() , lenghts() mais rien n'y fait (dans le fichier XML ci-dessous mon problème survient sur streetnumber).
    Je vais mettre un exemple de mon fichier XML pour que cela soit plus claire ainsi que le code que j'exploite et la stacktrace.

    Fichier XML :
    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
     
     
     
    -<customer numberofnights="6" id="ZTNWAQGI" checkin="27/02/2015">
     
    <firstname>Nnh</firstname>
    <booking>
        <lastname>TOTO</lastname>
        <id type="idcard">nnnn</id>
        <address>
           <streetnumber/>
           <streetname/>
           <zipcode/>
           <city/>
           <country/>
       </address>
       <phone>onoi</phone>
       <email/>
       <room id="205" type="rt3" state="available"/>
       </customer>
    </booking>
    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
    35
    36
    37
    38
    39
    40
    41
     
            final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();        
     
     
                final DocumentBuilder builder = factory.newDocumentBuilder();		
                final Document document = builder.parse(new File(XmlDoc));
     
                /** Tant qu'il y a des réservations on continue */
                for (Map.Entry<String, Booking> entree : hmBooking.entrySet()) {
     
                    final Element racine = document.getDocumentElement();
                    final NodeList racineNoeuds = racine.getChildNodes();
                    final int nbRacineNoeuds = racineNoeuds.getLength();        
     
                    for (int i = 0; i < nbRacineNoeuds; i++) {
     
                        if(racineNoeuds.item(i).getNodeType() == Node.ELEMENT_NODE){
     
                            Element nodeElement = (Element) racineNoeuds.item(i);
     
                            if (nodeElement.getTagName().equals("customer")) {
     
                                /** Modifie les attributs de l'élément customer */
                                NodeList nlCustomer = document.getElementsByTagName("customer");
     
                                if (nlCustomer != null && nlCustomer.getLength() > 0) {
     
                                    for (int y = 0; y < nlCustomer.getLength(); y++) {
     
                                        Node node = nlCustomer.item(y);
                                        Element e = (Element) node;
     
                                        String id = e.getAttribute("id");
     
                                        if (id.equals(entree.getValue().getIdbooking())) { 
     
                                                Node streetnumber = document.getElementsByTagName("streetnumber").item(y);
                                                if(!streetnumber.equals(null)){
                                                streetnumber.setTextContent(entree.getValue().getStreetnumber());}
     
    /** IL N'Y A PAS TOUT LE CODE MAIS LA SUITE EST IDENTIQUE ET A LA FIN IL Y A LE TRANSFORMER */
    La stackTrace :
    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    debug:
    Nnh
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    	at ***.projet.XMLBooking.ModifXmlBooking(XMLBooking.java:219)
    	at ***.projet.jDialogBooking.SaveDataBooking(jDialogBooking.java:257)
    	at ***.projet.jDialogBooking.ModifBooking(jDialogBooking.java:730)
    	at ***.projet.jDialogBooking.jBValiderActionPerformed(jDialogBooking.java:667)
    	at ***.projet.jDialogBooking.access$100(jDialogBooking.java:41)
    	at ***.projet.jDialogBooking$3.actionPerformed(jDialogBooking.java:421)
    	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    	at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289)
    	at java.awt.Component.processMouseEvent(Component.java:6525)
    	at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
    	at java.awt.Component.processEvent(Component.java:6290)
    	at java.awt.Container.processEvent(Container.java:2234)
    	at java.awt.Component.dispatchEventImpl(Component.java:4881)
    	at java.awt.Container.dispatchEventImpl(Container.java:2292)
    	at java.awt.Component.dispatchEvent(Component.java:4703)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
    	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
    	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
    	at java.awt.Container.dispatchEventImpl(Container.java:2278)
    	at java.awt.Window.dispatchEventImpl(Window.java:2739)
    	at java.awt.Component.dispatchEvent(Component.java:4703)
    	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
    	at java.awt.EventQueue.access$400(EventQueue.java:97)
    	at java.awt.EventQueue$3.run(EventQueue.java:697)
    	at java.awt.EventQueue$3.run(EventQueue.java:691)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
    	at java.awt.EventQueue$4.run(EventQueue.java:719)
    	at java.awt.EventQueue$4.run(EventQueue.java:717)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    	at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:109)
    	at java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:184)
    	at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:229)
    	at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:227)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:227)
    	at java.awt.Dialog.show(Dialog.java:1084)
    	at java.awt.Component.show(Component.java:1654)
    	at java.awt.Component.setVisible(Component.java:1606)
    	at java.awt.Window.setVisible(Window.java:1014)
    	at java.awt.Dialog.setVisible(Dialog.java:1005)
    	at ***.projet.BuildResa.jBModifResaActionPerformed(BuildResa.java:1645)
    	at ***.projet.BuildResa.access$1400(BuildResa.java:41)
    	at ***.projet.BuildResa$17.actionPerformed(BuildResa.java:964)
    	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    	at java.awt.Component.processMouseEvent(Component.java:6525)
    	at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
    	at java.awt.Component.processEvent(Component.java:6290)
    	at java.awt.Container.processEvent(Container.java:2234)
    	at java.awt.Component.dispatchEventImpl(Component.java:4881)
    	at java.awt.Container.dispatchEventImpl(Container.java:2292)
    	at java.awt.Component.dispatchEvent(Component.java:4703)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
    	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
    	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
    	at java.awt.Container.dispatchEventImpl(Container.java:2278)
    	at java.awt.Window.dispatchEventImpl(Window.java:2739)
    	at java.awt.Component.dispatchEvent(Component.java:4703)
    	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
    	at java.awt.EventQueue.access$400(EventQueue.java:97)
    	at java.awt.EventQueue$3.run(EventQueue.java:697)
    	at java.awt.EventQueue$3.run(EventQueue.java:691)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
    	at java.awt.EventQueue$4.run(EventQueue.java:719)
    	at java.awt.EventQueue$4.run(EventQueue.java:717)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    	at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
    BUILD SUCCESSFUL (total time: 1 minute 47 seconds)
    En vous remerciant à tous d'avance.

  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,

    Je ne comprends pas bien où tu as la NullPointerException : il faudrait que tu ajoutes un commentaire sur la ligne exacte du genre // c'est ici la ligne 219A priori, je devine que le problèle est dans ce bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Node streetnumber = document.getElementsByTagName("streetnumber").item(y);
    if(!streetnumber.equals(null)){ // ici probablement la ligne 219
        streetnumber.setTextContent(entree.getValue().getStreetnumber());}
    Déjà, ne fait jamais un equals(null) : ça ne sert à rien. equals(null) retourne toujours false, car une instance sur laquelle on appelle une méthode existe forcément, et ne peut pas être égale à null. Par contre, si une variable pointe sur aucune instance, et, donc, est de valeur null, appeler equals() sur cette méthode provoque forcément un NullPointerException.

    Pour tester si une instance est null, on utilise == :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Node streetnumber = document.getElementsByTagName("streetnumber").item(y);
    if( streetnumber != null ){ 
        streetnumber.setTextContent(entree.getValue().getStreetnumber());
    }
    Par contre, ceci n'a rien à voir avec le fait de tester si un Element est vide, ou n'a pas de valeur. Déjà il faut définir ce que tu entends par "est vide" et "n'a pas de valeur". Un Element element n'a pas de fils si element.hasChildNodes() retourne false. Mais si cette méthode retourne true, cela veut dire qu'elle a des nodes enfants : cela peut-être des Element, des Text, des commentaires (Comment), etc... Est-ce qu'un Element qui a un seul Node de type Comment est "vide" ? Un Element qui a uniquement en fils 3 nodes de type element, a-t-il une valeur ou pas ?

    L'API JDOM rend plus pratique ce genre de tests. Mais il est un peu tard maintenant pour changer.

    Pour récupérer le contenu texte d'un Element org.w3c, tu peux faire comme ça :

    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
    public class XmlUtils {
       public static String getText(Element element) {
          return getText(element, false);
       }
       public static String getText(Element element, boolean newline) {
          StringBuilder builder = null;
          NodeList list = element.getChildNodes();
          for(int i = 0; i < list.getLength(); i++) {
              Node node = list.item(i);
              short type = node.getNodeType();
              if(type == Node.TEXT_NODE || type == Node.CDATA_SECTION_NODE) {
                 if ( builder==null ) {
                    builder = new StringBuilder();
                }
                if ( newline ) {
                   if ( builder.length()>0 ) {
                      builder.append(System.lineSeparator());
                   }
                }
                builder.append(node.getNodeValue());
             }
          }
          return builder==null?null:builder.toString();
       }
    }
    Avec cette méthode tu peux tester si un Element a du texte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    boolean adutexte = XmlUtils.getText(element)!=null;
    boolean napasdetexte = XmlUtils.getText(element)==null;
    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
    Bonjour Joël,

    Super ! Ça fonctionne très bien par contre je suis déçu, juste parce que j'ai mis equals(null) au lieu de mettre != null cela n'a pas fonctionné ... JAVA aurait pu faire l'impasse pour moi.

    Concernant la ligne 219, c'est effectivement celle que tu as commenté c'est à dire (c'était un test) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Node streetnumber = document.getElementsByTagName("streetnumber").item(y);
    if(!streetnumber.equals(null)){ // ici probablement la ligne 219 ---> C'est bien celle là
        streetnumber.setTextContent(entree.getValue().getStreetnumber());}
    Tu as noté à la fin de ton message ceci :
    Avec cette méthode tu peux tester si un Element a du texte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    boolean adutexte = XmlUtils.getText(element)!=null;
    boolean napasdetexte = XmlUtils.getText(element)==null;
    Si j'essaie comme tu me l'a indiqué ça ne fonctionne pas il faut absolument que je fasse comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /** Ceci fonctionne */
    streetnumber != null
     
    /** Ceci ne fonctionne pas  */
    streetnumber.getTextContent(element) != null
    Après, bien évidemment je n'ai peut être pas fait les choses correctement donc l'erreur vient certainement de moi ? Sinon pour finir en laissant juste le nom du Node ça fonctionne.

    Qu'en penses-tu ?

    Merci d'avance

  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
    Salut

    Citation Envoyé par Jb_One73 Voir le message
    Super ! Ça fonctionne très bien par contre je suis déçu, juste parce que j'ai mis equals(null) au lieu de mettre != null cela n'a pas fonctionné ... JAVA aurait pu faire l'impasse pour moi.
    Réponse courte : et oui, la syntaxe est rigoureuse
    Réponse longue : clique sur le bouton "Montrer"

    Rappels:
    Il y a 2 sortes de types en Java : les types primitifis, comme int, boolean, long, double, char..., et les classes qui permettent de faire des objets
    Par définition, un objet, c'est des attributs et des méthodes. Techniquement, c'est une zone de mémoire. On la manipule par une réfrence (l'adresse de la zone de mémoire).
    Une variable de type classe contient une référence. La syntaxe Java fait que lorsqu'on met une expression du type ".quelquechose", on fait appel à une méthode ou un attribut de l'objet qui est désigné par cette référence..

    Les expressions toto==titi et toto.equals(titi) ont un sens différent. La première permet de tester si les références sont égales (les références contenues dans les variables), et la seconde, si les objets sont égaux logiquement (les objets désignés par leur référence contenue dans les variables toto et titi). On ne peut pas demander à Java de considérer que toto.equals(titi) exécute toto==titi quand toto et titi sont nulls : c'est un cas hyper particulier qui nécessiterait en plus pour l'exécuter qu'on teste systématiquement titi, donc de perdre du temps. La syntaxe n'est pas là pour permettre au programmeur d'écrire des trucs avec la mauvaise syntaxe et que ça fonctionne quand même parce que logiquement ça pourrait marcher dans ce cas partilculier, mais pour indiquer précisemment ce qu'on veut que le programme fasse. Or, quand on écrit toto.equals(titi) on veut précisemment dire qu'on veut comparer les objets et non leur référence, et on ne voudrait pas que Java fasse que, pour des cas particuliers, ça exécute toto==titi, au détriment de la logique de la syntaxe (et des performances, en plus).


    Citation Envoyé par Jb_One73 Voir le message
    Si j'essaie comme tu me l'a indiqué ça ne fonctionne pas il faut absolument que je fasse comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /** Ceci fonctionne */
    streetnumber != null
     
    /** Ceci ne fonctionne pas  */
    streetnumber.getTextContent(element) != null
    Parce que les deux lignes n'ont pas le même sens : la première permet de tester s'il y a un objet Element référencé par la variable streetnumber et la seconde permet d'appeler une méthode qui n'existe pas sur un Element. De plus, la première ne permet pas de tester si l'Element référencé par streetnumber contient du texte ou pas.

    Donc, ce serait plutôt comme ça que j'envisageais le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Element streetNumber = (Element)document.getElementsByTagName("streetnumber").item(y);
     
    if ( streetnumber != null ) [
       if ( XmlUtils.getText( streeNumber ) == null ) {
     
          // pas de texte dans l'élément référence par streeNummber
     
       }
    }
    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.

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/02/2015, 16h57
  2. [Débutant] [POO] Tester si la cellule est vide dans un tableau de cellules
    Par ghada97 dans le forum MATLAB
    Réponses: 2
    Dernier message: 23/09/2013, 13h27
  3. [AC-2003] Tester si une cellule est vide dans un classeur excel et faire une boucle
    Par moilou2 dans le forum VBA Access
    Réponses: 11
    Dernier message: 19/08/2009, 09h34
  4. Réponses: 3
    Dernier message: 27/01/2009, 10h03
  5. [VBA-E]Tester si une cellule est vide dans un cas particulier
    Par tonnick dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/09/2007, 10h12

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