我创建了两个列表。第一个列表是某种类型(Syncgroupset),第二个列表是字符串类型的arraylist。此syncgroupset类包含list类型的arraylist的getter和setter。
我将解析xml并将解析后的值复制到类的列表类型(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标记时,我将把值复制到其他类型字符串列表中。我不是仅在此处将同步组值添加到类型类列表中。
当我遇到syncgroupsetting的结束标记时,只有我通过替换将类型字符串列表添加到类型列表中。
然后我清除了字符串类型列表。当我这样做时,它甚至清除了列表中的列表。能不能让我知道我在哪里做错了。
答案 0 :(得分:2)
似乎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
调用传递的列表。