我现在正在使用SAX进行解析

时间:2012-07-10 04:58:12

标签: java parsing sax

我正在尝试使用SAX解析XML文档。 XML文档如下所示:

<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]

我想要的是Id属性中的DisplayNamear对,如下所示:

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

我做错了什么?我怎样才能达到预期的效果?

1 个答案:

答案 0 :(得分: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);
    }
}