2012-07-10 17 views
0

我想解析一個XML文檔使用SAX。 XML文檔如下所示:我正在解析使用SAX

<users> 
    <row Id="-1" DisplayName="Apple"> 
    <row Id="1" DisplayName="Banana"> 
    <row Id="2" DisplayName="Orange"> 
</users> 

這是我的分析器類,它負責解析row元素的摘錄:

class SAXParser extends DefaultHandler { 

    static int i = 0; 
    ArrayList<ArrayList<String>> ar = new ArrayList<ArrayList<String>>(); 
    ArrayList<String> id = new ArrayList<String>(); 

    public void startElement(String uri, String localName, 
          String qName, Attributes atts) { 

     if (qName.equals("row")) { 
        int idx = 0; 
        id.add(idx, atts.getValue(0)); 
        idx++; 
        id.add(idx, atts.getValue(3)); 
        ar.add(i, id); 
        i++; 
        //idx = 0; 
     } 
    } 

} 

如果我運行該程序,我得到以下導致ar屬性,這不是我想要的:

[2,Orange,1,Banana,-1,Apple], [2,Orange,1,Banana,-1,Apple], 
[2,Orange,1,Banana,-1,Apple], [2,Orange,1,Banana,-1,Apple] 

我想是有IdDisplayName雙在ar屬性是這樣的:

[-1, Apple], [1, Banana], [2, Orange] 

我做了什麼錯?我怎樣才能達到預期的效果?

+13

我急忙想着你的袖子卡在解析器中,但看起來你好,謝天謝地。 – 2012-07-10 05:04:27

+0

您無法運行該程序。請提供一個揭示問題的最小工作示例。 @Paul:也很害怕...... ;-) – Axel 2012-07-10 05:36:10

回答

1

問題是,您僅僅實例化了id列表一次,因此該列表將包含所有行的所有元素(標識符和顯示名稱)。

你必須創建每對新ArrayList

class SAXParser extends DefaultHandler 
{ 
    static int i = 0; 
    ArrayList<ArrayList<String>> ar = new ArrayList<ArrayList<String>>(); 
    // ***** Instead of creating the list here ***** 
    // ArrayList<String> id = new ArrayList<String>(); 

    public void startElement(String uri, String localName, String qName, Attributes atts) { 
     if (qName.equals("row")) { 
      // ***** Move that line here: ***** 
      ArrayList<String> id = new ArrayList<String>(); 

      int idx = 0; 
      id.add(idx, atts.getValue(0)); 
      idx++; 
      id.add(idx, atts.getValue(3)); 
      ar.add(i, id); 
      i++; 
      //idx = 0; 
     } 
    } 
} 

請注意,如果你是addig項目列表順序一個,你不必爲每個另外的指數,要素按照他們添加的順序排列。所以你的代碼可以進一步簡化:

public void startElement(String uri, String localName, String qName, Attributes atts) { 
    if (qName.equals("row")) { 
     ArrayList<String> id = new ArrayList<String>(); 
     id.add(atts.getValue(0)); 
     id.add(atts.getValue(3)); 
     ar.add(id); 
    } 
}