我正在使用saxParser的简单实现。在我的endElement方法中,我将vo对象存储到ArrayList。不幸的是,当我遍历我的List时,它只返回我的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());
}
}
}
答案 0 :(得分: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)&amp;然后当endElement发生时,'storeDetails'对象将被添加到arraylist中。因此,解析将继续进行,您将获得arraylist中的所有数据。
答案 1 :(得分:0)
我想问题是你对ArrayList中的所有项使用单个“vo object”实例。你需要在startElement中使用这样的smth:
storeDetailes = new ...
参考文档,解释Java内存模型。