0

我正在尝试使用 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,DisplayName对,如下所示:ar

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

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

4

1 回答 1

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;
        }
    }
}

请注意,如果您按顺序将项目添加到列表中,则不必为每个添加指定索引,元素将按照添加的顺序放置。所以你的代码可以进一步简化:

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);
    }
}
于 2012-07-10T06:33:08.910 回答