我尝试解析XML
时获得了最多的bizzarre行为,我逐步完成它并按顺序分配和检索所有值,然后将我创建的对象添加到{{1为了便于查找,问题是当我完成检索时,所有HashMap
都有空值而非空值是最后读取的节点的值,我已经走过了它一遍又一遍似乎都是正确的,但是当它完成加载HashMap
中的值时看起来像:
HasMap
等等。
我的XML文件的格式是:
[0] null
[1] NarrationItem@44e9d170
[2] null
[3] null
[4] NarrationItem@44e9d170
我的<narrations>
<narration id="0" name="A" alias="a" >
<line text="This is a test."></line>
</narration>
<narration id="1" name="B" alias="b" >
<line text="This another a test."></line>
</narration>
<narration id="2" name="C" alias="c" >
<line text="This is STILL a test."></line>
</narration>
</narrations>
解析方法如下:
XML
NarrationItem对象是一个自定义对象,定义为:
public HashMap<String, NarrationItem> NarrationMap = new HashMap<String, NarrationItem>();
private void LoadNarrationsXML() {
NarrationItem i = new NarrationItem();
String line;
String s;
try {
// Get the Android-specific compiled XML parser.
XmlResourceParser xmlParser = this.getResources().getXml(R.xml.narrations);
while (xmlParser.getEventType() != XmlResourceParser.END_DOCUMENT) {
if (xmlParser.getEventType() == XmlResourceParser.START_TAG) {
s = xmlParser.getName();
if (s.equals("narration")) {
i.Clear();
i.ID = xmlParser.getAttributeIntValue(null, "id", 0);
i.Name = xmlParser.getAttributeValue(null, "name");
i.Alias = xmlParser.getAttributeValue(null, "alias");
} else if (s.equals("line")) {
line = xmlParser.getAttributeValue(null, "text");
i.Narration.add(line);
}
} else if (xmlParser.getEventType() == XmlResourceParser.END_TAG) {
s = xmlParser.getName();
if (s.equals("narration")) {
NarrationMap.put(i.Alias, i);
}
}
xmlParser.next();
}
xmlParser.close();
} catch (XmlPullParserException xppe) {
Log.e(TAG, "Failure of .getEventType or .next, probably bad file format");
xppe.toString();
} catch (IOException ioe) {
Log.e(TAG, "Unable to read resource file");
ioe.printStackTrace();
}
}
如果有人能指出这个问题,我会非常感激,我已经坐在这里盯着这个问题好几个小时了。
答案 0 :(得分:3)
您只创建一个NarrationItem
对象 - 然后您使用对该对象的引用作为地图中多个条目的值。不要那样做。您需要了解地图不包含对象作为值 - 它包含对象的引用。
您可以通过每次创建新NarrationItem
而不是调用Clear
来解决此问题。
目前尚不清楚如何查看地图以查看这些空值,但如果您使用的是调试器并查看内部数据结构,那么您可能也不应该这样做 - 相反,步骤通过键,值或条目,即坚持HashMap
旨在支持的抽象。