0

我正在使用 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());
        }
    }
}
4

2 回答 2

1

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

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

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

在 startElement 中,您必须初始化“storeDetails”对象。

storeDetails = new StoreDetails();

在 endElement,您必须将“storeDetails”对象添加到数组列表中。

dataList.add(storeDetails);

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

于 2012-04-08T12:55:19.277 回答
0

我想问题是您对 ArrayList 中的所有项目都使用“vo 对象”的单个实例。你在 startElement 中需要这样的东西:

storeDetailes = new ...

请参阅文档,解释 Java 内存模型。

于 2012-04-08T07:46:25.803 回答