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 に答える