2014-10-19 69 views
0

我在將數據存儲在從本地xml文件解析的Hashmap的Arraylist中時遇到問題。在數組列表中存儲Sax解析器數據爲HashMap

首先,這裏是我的xml文件,

<?xml version="1.0"?> 
<organization> 
       <employee> 
           <title>Harry0</title> 
           <link>Smith0</link> 
           <date>hs0</date> 
           <salary>200000-0</salary> 
       </employee> 

       <employee> 
           <title>Harry1</title> 
           <link>Smith1</link> 
           <date>hs1</date> 
           <salary>300000-1</salary> 
       </employee> 

       <employee> 
           <title>Harry2</title> 
           <link>Smith2</link> 
           <date>hs2</date> 
           <salary>300000-2</salary> 
       </employee> 
</organization> 

我要存儲的Hashmap每對titlelinkdate然後把它裏面的HashMap數組列表。

我使用SAX解析器,但我無法實現我想要做的,

這裏是我的聲明HashMap和包含HashMap的ArrayList的代碼,

ArrayList<HashMap<String, String>> xml_Array = new ArrayList<HashMap<String,String>>(); 

    HashMap<String, String> keyValuePair = new HashMap<String, String>(); 

現在該怎麼辦我所做的是,

@Override 
    public void startElement(String uri, String localName, String qName, 
      Attributes attributes) throws SAXException { 
        startElement = localName;  
    } 


    @Override 
    public void characters(char[] ch, int start, int length) 
      throws SAXException { 
      elementValue = new String(ch, start, length); 
    } 


    @Override 
    public void endElement(String uri, String endElement, String qName) 
      throws SAXException { 
     super.endElement(uri, endElement, qName); 

     if (startElement == endElement){ 
      inElements = true; 
     } 

     if (inElements == true){ 
      if (endElement == "title"){ 
       keyValuePair.put("title", elementValue); 
       } 
      else if (endElement == "link"){ 
       keyValuePair.put("link", elementValue); 
       } 
      else if (endElement == "date"){ 
       keyValuePair.put("date", elementValue); 
       } 
      inElements = false; 
     } 

     xml_Array.add(keyValuePair); 
    } 


    @Override 
    public void endDocument() throws SAXException { 
     super.endDocument(); 

     Log.e("test",xml_Array + ""); 
    } 

在SAX解析器endElement方法,我檢查,如果元素是titledatelink,然後把它的數據一個HashMap中,並最終將其添加內部數組列表,但數據中的ArrayList,而不是追加被覆蓋,

這裏是logcat的我的輸出,

[{date=hs2, title=Harry2, link=Smith2}, {date=hs2, title=Harry2, link=Smith2}, {date=hs2, title=Harry2, link=Smith2}, {date=hs2, title=Harry2, link=Smith2}, {date=hs2, title=Harry2, link=Smith2}, {date=hs2, title=Harry2, link=Smith2}, {date=hs2, title=Harry2, link=Smith2}, {date=hs2, title=Harry2, link=Smith2}, {date=hs2, title=Harry2, link=Smith2}, {date=hs2, title=Harry2, link=Smith2}, {date=hs2, title=Harry2, link=Smith2}, {date=hs2, title=Harry2, link=Smith2}, {date=hs2, title=Harry2, link=Smith2}, {date=hs2, title=Harry2, link=Smith2}, {date=hs2, title=Harry2, link=Smith2}, {date=hs2, title=Harry2, link=Smith2}]

什麼ArrayList中僅添加了最後一名員工詳細信息多次?以及爲什麼前兩名員工的員工細節沒有顯示出來? 我在這裏做錯了什麼?

+0

http://simple.sourceforge.net/ – 2014-10-19 13:36:10

回答

2

你只創建一個HashMap實例

HashMap<String, String> keyValuePair = new HashMap<String, String>(); 

然後你不斷增加的同一實例到列表中。這就是爲什麼列表中的所有地圖都是同一個實例。

您必須在每次初始化要添加到列表的新地圖之前調用keyValuePair = new HashMap<String, String>();

+0

謝謝你的作品,但有一個新問題。不是像這樣添加它,{date = hs2,title = Harry2,link = Smith2},它將每個鍵/值對添加到新的大括號中,[{title = Harry0},{link = Smith0},{ date = hs0},{title = Harry1},{link = Smith1},{date = hs1},{title = Harry2},{link = Smith2},{date = hs2}] – 2014-10-19 13:31:18

+0

@Riley Willow你應該創建一個新的HashMap放在正確的位置,這是在分析新員工的XML之前。 – Eran 2014-10-19 14:20:05