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リストを1回だけインスタンス化するため、そのリストにはすべての行のすべての要素(識別子と表示名も)が含まれることです。

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