2012-04-08 5 views
0

Ich verwende eine einfache Implementierung von saxParser. Innerhalb meiner endElement-Methode speichere ich Vo-Objekte in einer ArrayList. Leider, wenn ich meine Liste überstreiche, gibt es nur das letzte Element aus meinen XML-Daten zurück. Ich frage mich nur, was ich falsch mache? Relavent Code unten:Android + saxParser + Speichern von Objekten in ArrayList

public class MyXMLHandler extends DefaultHandler { 
    private StringBuffer buffer = new StringBuffer(); 
    private Boolean currentElement = false; 

    private StoreDetails storeDetails = new StoreDetails(); //vo object 
    private ArrayList<StoreDetails> dataList = new ArrayList<StoreDetails>(); //list of vo 

    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 
     currentElement = true; 
    } 

    @Override 
    public void endElement(String uri, String localName, String qName) throws SAXException { 

     currentElement = false;  

     if (localName.equals("StoreID")) { 
      buffer.toString().trim(); 
      storeDetails.setStoreId(buffer.toString()); 
     } else if (localName.equals("StoreName")) { 
      buffer.toString().trim(); 
      storeDetails.setStoreName(buffer.toString()); 
     } else if (localName.equals("StoreCategory")) { 
      buffer.toString().trim(); 
      storeDetails.setStoreCategory(buffer.toString()); 

      //add vo object to ArrayList - dataList 
      dataList.add(storeDetails); 
     } 

     buffer = new StringBuffer(); 
    }  

    @Override 
    public void characters(char[] ch, int start, int length) throws SAXException { 
     if (currentElement) { 
      buffer.append(ch, start, length); 
      currentElement = false; 
     } 
    } 

    @Override 
    public void endDocument() throws SAXException { 
     Log.i("TAG", "DONE PARSING XML"); 
     for(StoreDetails details : dataList){ 
      //ISSUE - returning only the last row in my xml data (over and over) 
      Log.i("TAG", "Details ID: " + details.getStoreId()); 
     } 
    } 
} 

Antwort

1

Sie müssen das Objekt neu initialisieren, nachdem Sie es zur Array-Liste hinzugefügt haben. Ansonsten speichert es die letzten Daten.

nun Zum Beispiel, wenn Ihr xml ist so etwas wie diese, dann

<Item> 
<StoreID></StoreID> 
<StoreName></StoreName> 
<StoreCategory></StoreCategory> 
</Item> 

Bei start Sie das ‚storeDetails‘ Objekt zu initialisieren haben.

storeDetails = new StoreDetails(); 

Bei endElement müssen Sie das 'StoreDetails'-Objekt zur Array-Liste hinzufügen.

dataList.add(storeDetails); 

Auf diese Weise, wenn sie bei start auftreten wird, wird ‚storeDetails‘ Objekt erhalten initialisieren, wird es aktuelle Element der Informationen (StoreID, Storename, StoreCategory) speichern & dann, wenn sie bei endelement ‚storeDetails‘ Objekt auftreten wird zur Arraylist hinzugefügt. Somit wird das Parsing fortgesetzt und Sie erhalten alle Daten in Ihrer Arraylist.

+0

Ok, diese Antwort zeigte mir in die richtige Richtung. Um zu beachten, für meine spezifische XML, musste ich einfach die StoreDetails = new StoreDetails(); innerhalb eines bestimmten localName conditional: if (localName.equals ("Store")) storeDetails = new StoreDetails(); – worked

0

Ich denke, das Problem ist, dass Sie einzelne Instanz „vo Objekt“ für alle Elemente in Arraylist verwenden. Sie brauchen smth wie folgt in startElement:

storeDetailes = new ... 

Siehe Dokumente, erklären Java-Speichermodell.