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());
}
}
}
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