我创建了两个列表。第一个列表是某个类类型(Syncgroupset),第二个列表是字符串类型的arraylist。这个syncgroupset类包含类型列表的arraylist的getter和setter。
我将解析xml,并将解析的值复制到class(syncgroupset)的列表类型。
请找到如下的xml。
<syncgroupsettings>
<syncgroupset id = "sgMS" labelid = "lblMS" enabled = "YES" default = "OFF">
<syncgroup syncgroupname = "VISITS"/>
<syncgroup syncgroupname = "CUSTOMERS"/>
</syncgroupset>
<syncgroupset id = "sgAS" labelid = "lblAS" enabled = "YES" default = "ON">
<syncgroup syncgroupname = "SALESDOCS"/>
<syncgroup syncgroupname = "ANALYTICS"/>
</syncgroupset>
</syncgroupsettings>
请找到如下代码
public List<Syncgroupset> parse(XmlPullParser parser) {
String id = "";
String synlabelid="";
String enabled = "";
String default1 = "";
String syngroupname = "";
List<Syncgroupset> mysynset = new ArrayList<Syncgroupset>();
try {
int eventType = parser.getEventType();
List<String> mysyname = new ArrayList<String>();
while (eventType != XmlPullParser.END_DOCUMENT) {
String tagname = parser.getName();
switch (eventType) {
case XmlPullParser.START_TAG:
if(tagname.equalsIgnoreCase("labels"))
{
skip(parser);
}else
if (tagname.equalsIgnoreCase("syncgroupsettings")) {
// do nothing
}else
if (tagname.equalsIgnoreCase("syncgroupset")) {
syncgroupset = new Syncgroupset();
id = parser.getAttributeValue(ns,"id");
synlabelid = parser.getAttributeValue(ns,"labelid");
enabled = parser.getAttributeValue(ns,"enabled");
default1 = parser.getAttributeValue(ns,"default");
syncgroupset.setLabelid(synlabelid);
syncgroupset.setEnabled(enabled);
syncgroupset.setDefault(default1);
syncgroupset.setId(id);
mysynset.add(syncgroupset);
}else
if(tagname.equalsIgnoreCase("syncgroup"))
{
syngroupname = parser.getAttributeValue(ns,"syncgroupname");
mysyname.add(syngroupname);
}
break;
case XmlPullParser.TEXT:
break;
case XmlPullParser.END_TAG:
if (tagname.equals("syncgroupset")) {
mysynset.get(mysynset.size() - 1).setSyncgroup(mysyname);
mysyname.clear();
}
break;
default:
break;
}
eventType = parser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return mysynset;
}
当我遇到syncgroup标签时,我会将值复制到其他类型的字符串列表中。我不是仅在这里将syncgroup值添加到类型类的列表中。
当我遇到syncgroupsetting的结束标签时,只有我通过替换将string类型的列表添加到type类的列表中。
然后,我要清除字符串类型的列表。当我这样做时,它甚至会清除班级列表中的列表。您能否让我知道我做错了什么。
最佳答案
似乎Syncgroupset
保留了使用setSyncgroup(list)
传递给它的列表的浅表副本。这就是list.clear()
也会影响Syncgroupset
的原因。
更改此行:
mysynset.get(mysynset.size() - 1).setSyncgroup(mysyname);
对此:
mysynset.get(mysynset.size() - 1).setSyncgroup(new ArrayList<String>(mysyname));
这样,它将不会被
mysyname
传递给它,但是复制了
mysyname
所有元素的全新列表,然后
mysyname.clear()
绝对不会影响通过该setSyncgroup
调用传递的列表。