[java] Probleme incomprehensible avec JDOM (long mais help please:'()

Probleme incomprehensible avec JDOM (long mais help please:'() [java] - Java - Programmation

Marsh Posté le 19-05-2004 à 08:36:26    

Bonjour
 
j'utilise JDOM pour mon projet d'info. Ce projet est un client mail, et je gère les comptes mail avec JDOM.
 
extrait :
 

Code :
  1. import org.jdom.*;
  2. import org.apache.xerces.parsers.DOMParser;
  3. import org.xml.sax.InputSource;
  4. import org.jdom.output.*; 
  5. import org.jdom.input.DOMBuilder; 
  6. import java.io.*;
  7. import javax.swing.*;
  8. public class GestionComptes2  {
  9. public void supprimerCompte(int index) {
  10.  DOMParser parser = new DOMParser();
  11.  org.w3c.dom.Document domDoc = null;
  12.  try{
  13.   parser.parse(new InputSource("comptes.xml" ));
  14.   domDoc = parser.getDocument();
  15.  /****************************************/
  16.       //Conversion du document DOM en document JDOM
  17.  DOMBuilder builder = new DOMBuilder();
  18.  org.jdom.Document documentJDOM = builder.build(domDoc);
  19.  /*****************************************/
  20.  GestionComptes gestion = new GestionComptes();
  21.  int numero = gestion.nombreComptes()+index;
  22.  System.out.println("on va enlever le compte : "+(index));
  23.  documentJDOM.getRootElement().removeContent(index);
  24.  /*****************************************/
  25.  // sortie
  26.   XMLOutputter outputter = new XMLOutputter();
  27.   outputter.output(documentJDOM, System.out);
  28.   FileOutputStream sortie = new FileOutputStream("prout.xml" );
  29.   outputter.output(documentJDOM, sortie);
  30.   sortie.flush();
  31.   sortie.close();
  32.  /******************************************/
  33.  JDialog information = new JDialog();
  34.  JPanel information_panel = new JPanel();
  35.  information.setContentPane(information_panel);
  36.  information.pack();
  37.  information.setVisible(true);
  38.  /*******************************************
  39.   MANQUE :
  40.   ----> supprimer effectivmeent le compte
  41.   ----> fermer la fenetre de compte, pour laisser la place au JDialog
  42.   ----> a la fermeture du JDialog, -> reafficher fenetre compte
  43.  *********************************************/
  44.  }
  45.  catch (Exception e) {System.out.println(""+e);}
  46. }


 
tout d'abord, le parseur xerces parse mon fichier "compte.xml".
ensuite, je convertis le document obtenu en document JDOM. Dès lors, je veux bosser avec ce JDOM.
j'implemente une fonction supprimerCompte qui recoit comme argument un entier, qui provient d'une JList dans une autre classe :
 

Code :
  1. menu_supprimer.addActionListener(
  2.   new ActionListener() {
  3.    public void actionPerformed(ActionEvent e) {
  4.     System.out.println("numero selectionne : "+liste_comptes.getSelectedIndex());
  5.     if (liste_comptes.getSelectedIndex() == -1) {
  6.      System.out.println("choisi un compte tocard !" );
  7.     }
  8.     else {
  9.     GestionComptes2 gestion = new GestionComptes2();
  10.     int numero = liste_comptes.getSelectedIndex() +1;
  11.     gestion.supprimerCompte(numero);
  12.     }
  13.    }
  14.   });


 
donc vous voyez qu'a la fin, je lance la fonction supprimerCompte(numero) ;
 
donc ca se passe comme ca :
 
dans ma JList, si je selectionne un compte, j'ai un entier associé (de 0 pour le premier à trois pour le troisieme), que j'ai majoré de un pour que ca marche.
 
voici mon fichier compte.xml :
 

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <liste_compte>
  3.         <compte>
  4.                 <type>pop</type>
  5.                 <nom>perchut2 sur free</nom>
  6.                 <identite>Perchut2</identite>
  7.                 <adresse>perchut2@free.fr</adresse>
  8.                 <serveur_pop>pop3.free.fr</serveur_pop>
  9.                 <port_pop>110</port_pop>
  10.                 <serveur_smtp>smtp.free.fr</serveur_smtp>
  11.                 <port_smtp>25</port_smtp>
  12.                 <user>perchut2</user>
  13.                 <pass>************</pass>
  14.         </compte><compte>
  15.                 <type>pop</type>
  16.                 <nom>mathieu</nom>
  17.                 <identite>mathieu</identite>
  18.                 <adresse>mathieu*******@free.fr</adresse>
  19.                 <serveur_pop>pop3.free.fr</serveur_pop>
  20.                 <port_pop>110</port_pop>
  21.                 <serveur_smtp>smtp.free.fr</serveur_smtp>
  22.                 <port_smtp>25</port_smtp>
  23.                 <user>mathieu***********</user>
  24.                 <pass>********</pass>
  25.         </compte><compte>
  26.                 <type>qsdfqsd</type>
  27.                 <nom>fsqdf</nom>
  28.                 <identite>qsdf</identite>
  29.                 <adresse>sqdf</adresse>
  30.                 <serveur_pop>sq</serveur_pop>
  31.                 <port_pop>dfqsdf</port_pop>
  32.                 <serveur_smtp>qsdfq</serveur_smtp>
  33.                 <port_smtp>sd</port_smtp>
  34.                 <user>fqsdf</user>
  35.                 <pass>qsdfq</pass>
  36.                 </compte>
  37.         </liste_compte>


 
je precise que les deux premiers comptes ont été ajoutés à la main dans le fichier pendant le developpement, tandis que le troisieme a été ajouté via la fonction :
 

Code :
  1. /* crée un compte */
  2. public void nouveauCompte(String type2,
  3.    String nom2,
  4.    String identite2,
  5.    String adresse2,
  6.    String serveur_pop32,
  7.    String port_pop32,
  8.    String serveur_smtp2,
  9.    String port_smtp2,
  10.    String user2,
  11.    String pass2) {
  12.   int nombre_comptes = 0;
  13.  DOMParser parser = new DOMParser();
  14.  org.w3c.dom.Document domDoc = null;
  15.  try{
  16.   parser.parse(new InputSource("comptes.xml" ));
  17.   domDoc = parser.getDocument();
  18.  /****************************************/
  19.       //Conversion du document DOM en document JDOM
  20.  DOMBuilder builder = new DOMBuilder();
  21.  org.jdom.Document documentJDOM = builder.build(domDoc);
  22.   // sortie  
  23.  XMLOutputter outputter = new XMLOutputter();
  24.  outputter.output(documentJDOM, System.out);
  25.  /*****************************************/
  26.   Element compte1 = new Element("compte" );
  27.   Element type1 = new Element("type" );
  28.   type1.setText(type2);
  29.   compte1.addContent(type1);
  30.   Element nom1 = new Element("nom" );
  31.   nom1.setText(nom2);
  32.   compte1.addContent(nom1);
  33.   Element identite1 = new Element("identite" );
  34.   identite1.setText(identite2);
  35.   compte1.addContent(identite1);
  36.   Element adresse1 = new Element("adresse" );
  37.   adresse1.setText(adresse2);
  38.   compte1.addContent(adresse1);
  39.   Element serveur_pop1 = new Element("serveur_pop" );
  40.   serveur_pop1.setText(serveur_pop32);
  41.   compte1.addContent(serveur_pop1);
  42.   Element port_pop31 = new Element("port_pop" );
  43.   port_pop31.setText(port_pop32);
  44.   compte1.addContent(port_pop31);
  45.   Element serveur_smtp1 = new Element("serveur_smtp" );
  46.   serveur_smtp1.setText(serveur_smtp2);
  47.   compte1.addContent(serveur_smtp1);
  48.   Element port_smtp1 = new Element("port_smtp" );
  49.   port_smtp1.setText(port_smtp2);
  50.   compte1.addContent(port_smtp1);
  51.   Element user1 = new Element("user" );
  52.   user1.setText(user2);
  53.   compte1.addContent(user1);
  54.   Element pass1 = new Element("pass" );
  55.   pass1.setText(pass2);
  56.   compte1.addContent(pass1);
  57.   // (documentJDOM est une instance de la classe org.jdom.Document)
  58.   documentJDOM.getRootElement().addContent(compte1);
  59.   FileOutputStream sortie = new FileOutputStream("comptes.xml" );
  60.   outputter.output(documentJDOM, sortie);
  61.   sortie.flush();
  62.   sortie.close();
  63.   }


 
ca m'a rajouté le dernier compte, sans les sauts de ligne (je les ai rajoutés à la mano, je croyais que c'etait le pb  :pt1cable: )

et donc à l'appel de ma fonction "supprimerCompte(int)" :

 
les trois comptes dans la JList sont dans l'ordre :  
 
Perchut2
mathieu*********
qsdfqsd
 
 
* si je selectionne le premier compte dans la JList :
 
l'output est :
 

numero selectionne : 0
on va enlever le compte : 1
<?xml version="1.0" encoding="UTF-8"?>
<liste_compte>
        <compte>
                <type>pop</type>
                <nom>mathieu*************</nom>
                <identite>Mathieu*************</identite>
                <adresse>mathieu**************@free.fr</adresse>
                <serveur_pop>pop3.free.fr</serveur_pop>
                <port_pop>110</port_pop>
                <serveur_smtp>smtp.free.fr</serveur_smtp>
                <port_smtp>25</port_smtp>
                <user>mathieu*************</user>
                <pass>************</pass>
        </compte>
                <compte>
                <type>qsdfqsd</type>
                <nom>fsqdf</nom>
                <identite>qsdf</identite>
                <adresse>sqdf</adresse>
                <serveur_pop>sq</serveur_pop>
                <port_pop>dfqsdf</port_pop>
                <serveur_smtp>qsdfq</serveur_smtp>
                <port_smtp>sd</port_smtp>
                <user>fqsdf</user>
                <pass>qsdfq</pass>
                </compte>
        </liste_compte>


 
 
si je selectionne le deuxieme :
 

Code :
  1. numero selectionne : 1
  2. on va enlever le compte : 2
  3. <?xml version="1.0" encoding="UTF-8"?>
  4. <liste_compte>
  5.         <compte>
  6.                 <type>pop</type>
  7.                 <nom>perchut2 sur free</nom>
  8.                 <identite>Perchut2</identite>
  9.                 <adresse>perchut2@free.fr</adresse>
  10.                 <serveur_pop>pop3.free.fr</serveur_pop>
  11.                 <port_pop>110</port_pop>
  12.                 <serveur_smtp>smtp.free.fr</serveur_smtp>
  13.                 <port_smtp>25</port_smtp>
  14.                 <user>perchut2</user>
  15.                 <pass>*************</pass>
  16.         </compte>
  17.                 <compte>
  18.                 <type>qsdfqsd</type>
  19.                 <nom>fsqdf</nom>
  20.                 <identite>qsdf</identite>
  21.                 <adresse>sqdf</adresse>
  22.                 <serveur_pop>sq</serveur_pop>
  23.                 <port_pop>dfqsdf</port_pop>
  24.                 <serveur_smtp>qsdfq</serveur_smtp>
  25.                 <port_smtp>sd</port_smtp>
  26.                 <user>fqsdf</user>
  27.                 <pass>qsdfq</pass>
  28.                 </compte>
  29.         </liste_compte>


 
 
* si je selectionne le troisieme :
 

numero selectionne : 2
on va enlever le compte : 3
<?xml version="1.0" encoding="UTF-8"?>
<liste_compte>
        <compte>
                <type>pop</type>
                <nom>perchut2 sur free</nom>
                <identite>Perchut2</identite>
                <adresse>perchut2@free.fr</adresse>
                <serveur_pop>pop3.free.fr</serveur_pop>
                <port_pop>110</port_pop>
                <serveur_smtp>smtp.free.fr</serveur_smtp>
                <port_smtp>25</port_smtp>
                <user>perchut2</user>
                <pass>*******************</pass>
        </compte><compte>
                <type>pop</type>
                <nom>mathieu************** sur free</nom>
                <identite>Mathieu*****************</identite>
                <adresse>mathieu************@free.fr</adresse>
                <serveur_pop>pop3.free.fr</serveur_pop>
                <port_pop>110</port_pop>
                <serveur_smtp>smtp.free.fr</serveur_smtp>
                <port_smtp>25</port_smtp>
                <user>mathieu**********</user>
                <pass>*************</pass>
        </compte><compte>
                <type>qsdfqsd</type>
                <nom>fsqdf</nom>
                <identite>qsdf</identite>
                <adresse>sqdf</adresse>
                <serveur_pop>sq</serveur_pop>
                <port_pop>dfqsdf</port_pop>
                <serveur_smtp>qsdfq</serveur_smtp>
                <port_smtp>sd</port_smtp>
                <user>fqsdf</user>
                <pass>qsdfq</pass>
                </compte>
        </liste_compte>


 
 
voilà, je comprends rien... quelqu'un aurait une idée :??:  [:sisicaivrai]
 
pour ceux qui auraient décroché,  le troisieme compte ne se supprime pas [:joce]


Message édité par perchut2 le 19-05-2004 à 08:39:55
Reply

Marsh Posté le 19-05-2004 à 08:36:26   

Reply

Marsh Posté le 19-05-2004 à 11:37:28    

  • Commence par lire et écrire du XML entièrement avec JDOM au lieu d'utiliser Xerces en premier (SAXBuilder te renvoie direct un Document JDom).
  • Travailles avec une classe implémentant ListModel que tu affectes à un JList. Tu fais tes ajouts/supressions dans le modèle et tu rafraîchie la liste.


Après ça on pourra voir  :jap:  
 
 
 

Reply

Marsh Posté le 19-05-2004 à 13:16:29    

pascal34 a écrit :

  • Commence par lire et écrire du XML entièrement avec JDOM au lieu d'utiliser Xerces en premier (SAXBuilder te renvoie direct un Document JDom).
  • Travailles avec une classe implémentant ListModel que tu affectes à un JList. Tu fais tes ajouts/supressions dans le modèle et tu rafraîchie la liste.


Après ça on pourra voir  :jap:


 
ah je savais pas que SAXbuilder renvoyait un jdom :o, j'ai un peu de mal avec les rares tutos sur cette api :/
 
je vais essayer ca, merci :hello:

Reply

Marsh Posté le 19-05-2004 à 13:18:19    

test case

Reply

Marsh Posté le 19-05-2004 à 13:41:31    

Perchut2 a écrit :

ah je savais pas que SAXbuilder renvoyait un jdom


 
org.jdom.input.SAXBuilder

Reply

Marsh Posté le 19-05-2004 à 21:47:14    

bon effectivement, c'est plus simple avec SAXBuilder.

Code :
  1. SAXBuilder builder = new SAXBuilder();
  2.  Document documentJDOM = builder.build("comptes.xml" );


 
:)
 
 
Ca a l'air de marcher. Ce n'est pas grace au changement vers SAXBuilder, parce que ca me faisait le meme probleme.
J'ai par contre viré mon fichier, et j'ai commencé avec un fichier vide, créé des comptes, et là je peux les supprimer proprement via la methode que j'ai écrite.
 
donc c'est cool, merci :hello:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed