我正在尝试使用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]
我做错了什么?我怎样才能达到预期的效果?
答案 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);
}
}