Android 安卓&x2B;saxParser+;将对象存储到ArrayList中

Android 安卓&x2B;saxParser+;将对象存储到ArrayList中,android,arraylist,saxparser,Android,Arraylist,Saxparser,我正在使用saxParser的一个简单实现。在endElement方法中,我将vo对象存储到ArrayList中。不幸的是,当我在列表上循环时,它只返回xml数据中的最后一项。只是想知道我做错了什么?相关代码如下: public class MyXMLHandler extends DefaultHandler { private StringBuffer buffer = new StringBuffer(); private Boolean currentElement =

我正在使用saxParser的一个简单实现。在endElement方法中,我将vo对象存储到ArrayList中。不幸的是,当我在列表上循环时,它只返回xml数据中的最后一项。只是想知道我做错了什么?相关代码如下:

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());
        }
    }
}
公共类MyXMLHandler扩展了DefaultHandler{
私有StringBuffer=新StringBuffer();
私有布尔currentElement=false;
private StoreDetails StoreDetails=new StoreDetails();//vo对象
私有ArrayList dataList=新ArrayList();//vo列表
public void startElement(字符串uri、字符串localName、字符串qName、属性)引发SAXException{
currentElement=true;
}
@凌驾
public void endElement(字符串uri、字符串localName、字符串qName)引发SAXException{
currentElement=false;
if(localName.equals(“StoreID”)){
buffer.toString().trim();
setStoreId(buffer.toString());
}else if(localName.equals(“StoreName”)){
buffer.toString().trim();
setStoreName(buffer.toString());
}else if(localName.equals(“StoreCategory”)){
buffer.toString().trim();
setStoreCategory(buffer.toString());
//将vo对象添加到ArrayList-dataList
dataList.add(storeDetails);
}
buffer=新的StringBuffer();
}    
@凌驾
公共无效字符(char[]ch,int start,int length)引发异常{
if(当前元素){
追加缓冲区(ch、开始、长度);
currentElement=false;
}
}
@凌驾
public void endDocument()引发异常{
i(“标记”,“解析XML完成”);
对于(StoreDetails:dataList){
//问题-仅返回xml数据中的最后一行(一遍又一遍)
Log.i(“TAG”,“Details ID:+Details.getStoreId());
}
}
}

我想问题在于,对ArrayList中的所有项使用“vo对象”的单个实例。在startElement中,您需要这样的smth:

storeDetailes = new ...

请参阅说明Java内存模型的文档。

将对象添加到数组列表后,必须重新初始化该对象。否则将保存最后的数据

例如,如果您的xml是这样的,那么

<Item>
<StoreID></StoreID>
<StoreName></StoreName>
<StoreCategory></StoreCategory>
</Item>
在endElement中,必须将“storeDetails”对象添加到数组列表中

dataList.add(storeDetails);

这样,当发生在startElement时,“storeDetails”对象将被初始化,它将保存当前项的信息(StoreID、StoreName、StoreCategory)&然后当发生在endElement时,“storeDetails”对象将被添加到arraylist。因此,解析将继续进行,您将获得arraylist中的所有数据。

好的,这个答案为我指明了正确的方向。注意,对于我的特定XML,我只需放置storeDetails=newstoredetails();在某个localName条件中:if(localName.equals(“Store”))storeDetails=newstoredetails();
dataList.add(storeDetails);