android XML解析成哈希映射无法正常工作

时间:2011-09-30 16:00:05

标签: android xml arraylist xml-parsing hashmap

我尝试解析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();
     }
 }

如果有人能指出这个问题,我会非常感激,我已经坐在这里盯着这个问题好几个小时了。

1 个答案:

答案 0 :(得分:3)

您只创建一个NarrationItem对象 - 然后您使用对该对象的引用作为地图中多个条目的值。不要那样做。您需要了解地图不包含对象作为值 - 它包含对象的引用

您可以通过每次创建新NarrationItem而不是调用Clear来解决此问题。

目前尚不清楚如何查看地图以查看这些空值,但如果您使用的是调试器并查看内部数据结构,那么您可能也不应该这样做 - 相反,步骤通过键,值或条目,即坚持HashMap旨在支持的抽象。