alvinm93 Posté(e) 14 juillet 2011 Share Posté(e) 14 juillet 2011 Bonjour tout le monde! J'ai un problème étrange avec mon ArrayList d'un objet personnalisé public ArrayList<MonObject> getXMLResult(){ mObjectList = new ArrayList<MonObject>(); try { // creates and returns new instance of SAX-implementation: SAXParserFactory factory = SAXParserFactory.newInstance(); // create SAX-parser... SAXParser parser = factory.newSAXParser(); // .. define our handler: MonHandler handler = new MonHandler(); // and parse: parser.parse("file:///sdcard/fichierxml.xml", handler); } catch (Exception ex) { ex.printStackTrace(System.out); } return mObjectList; } private static final class MonHandler extends DefaultHandler { private String lastElement = "null"; static MonObject actualObject = new MonObject(); // invoked when document-parsing is started: public void startDocument() throws SAXException { System.out.println("Document processing started"); } // notifies about finish of parsing: public void endDocument() throws SAXException { for(int i = 0; i<mObjectList.size();i++){ MonObject focusedObject = mObjectList.get(i); System.out.println(focusedObject.getName()); } System.out.println("Document processing finished"); } // we enter to element 'qName': public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException { if (qName.equals("maintag")) { } else if (qName.equals("MonObject")) { actualObject = new MonObject(); actualObject.setName(attrs.getValue("name")); mObjectList.add(actualObject); /* if (...) } */ else { throw new IllegalArgumentException("Element '" + qName + "' is not allowed here"); } setLastElement(qName); } // we leave element 'qName' without any actions: public void endElement(String uri, String localName, String qName) throws SAXException { // do nothing; } public void setLastElement(String lastElement) { this.lastElement = lastElement; } public String getLastElement() { return lastElement; } } Mais les System.out de la boucle donnent object2 object2 object2 au lieu de donner object0 object1 object2 Pourtant juste avant de l'ajouter dans l'arraylist je fais un MonObject.getName() j'obtient le nom correct Donc quand j'ajoute un élément à mon ArrayList, tout les autres éléments prennent la valeur du dernier. Si au lieu de faire un ArrayList de MonObject je fais un arraylist de String là sa marche mais c'est pas le but car j'ai plusieurs variables puis plus tard une liste dans une liste à retourner. Quelqu'un aurait une solution? Lien vers le commentaire Partager sur d’autres sites More sharing options...
nbbu Posté(e) 15 juillet 2011 Share Posté(e) 15 juillet 2011 Donc quand j'ajoute un élément à mon ArrayList, tout les autres éléments prennent la valeur du dernier. C'est logique puisque ton objet "actualObject" est déclaré static donc c'est une instance de classe donc unique pour ta classe. Quelqu'un aurait une solution? En enlevant static ça devrait fonctionner. MonObject actualObject = new MonObject(); Lien vers le commentaire Partager sur d’autres sites More sharing options...
alvinm93 Posté(e) 16 juillet 2011 Auteur Share Posté(e) 16 juillet 2011 public ArrayList<MonObject> getXMLResult(){ mObjectList = new ArrayList<MonObject>(); try { // creates and returns new instance of SAX-implementation: SAXParserFactory factory = SAXParserFactory.newInstance(); // create SAX-parser... SAXParser parser = factory.newSAXParser(); // .. define our handler: MonHandler handler = new MonHandler(); // and parse: parser.parse("file:///sdcard/fichierxml.xml", handler); } catch (Exception ex) { ex.printStackTrace(System.out); } return mObjectList; } private final class MonHandler extends DefaultHandler { private String lastElement = "null"; MonObject actualObject = new MonObject(); // invoked when document-parsing is started: public void startDocument() throws SAXException { System.out.println("Document processing started"); } // notifies about finish of parsing: public void endDocument() throws SAXException { for(int i = 0; i<mObjectList.size();i++){ MonObject focusedObject = mObjectList.get(i); System.out.println(focusedObject.getName()); } System.out.println("Document processing finished"); } // we enter to element 'qName': public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException { if (qName.equals("maintag")) { } else if (qName.equals("MonObject")) { actualObject = new MonObject(); actualObject.setName(attrs.getValue("name")); mObjectList.add(new MonObject(actualObject)); /* if (...) } */ else { throw new IllegalArgumentException("Element '" + qName + "' is not allowed here"); } setLastElement(qName); } // we leave element 'qName' without any actions: public void endElement(String uri, String localName, String qName) throws SAXException { // do nothing; } public void setLastElement(String lastElement) { this.lastElement = lastElement; } public String getLastElement() { return lastElement; } } Merci mais le problème est toujours présent, j'ai enlevé le static dans la déclaration de actualObject, j'ai même testé en l'enlevant dans la déclaration de la class du handler, et pour éviter un problème de passage par référence j'ai créer dans la classe MonObject un constructeur qui va copier les variables "new MonObject(actualObject);" Là je ne trouve vraiment pas le problème Lien vers le commentaire Partager sur d’autres sites More sharing options...
nbbu Posté(e) 17 juillet 2011 Share Posté(e) 17 juillet 2011 Effectivement bizarre. Peux tu donner le code de ta classe MonObject ... j'imagine qu'elle n'est pas statique ;) et un exemple de ton fichier xml. Ainsi je le lancerai chez moi pour voir ça. Lien vers le commentaire Partager sur d’autres sites More sharing options...
alvinm93 Posté(e) 21 juillet 2011 Auteur Share Posté(e) 21 juillet 2011 Problème résolu, en voyant la réponse de nbbu j'ai regardé les variables de ma classe MonObject, la classe n'étai pas en static mais les variables oui. Merci !! :D Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.