【问题标题】:android XML parse into Hash map not workingandroid XML解析成哈希映射不起作用
【发布时间】:2011-11-28 14:34:00
【问题描述】:

我在尝试解析XML 时遇到了最奇怪的行为,我逐步运行它,并按顺序分配和检索所有值,然后将我创建的对象添加到HashMap 以方便抬头看,问题是当我完成检索它时,所有HashMap 都有空值,而不是空值是读取的最后一个节点的值,我一遍又一遍地遍历它一切似乎都是正确的,但是当它完成加载 HasMap 中的值时,看起来像:

[0] null
[1] NarrationItem@44e9d170
[2] null
[3] null
[4] NarrationItem@44e9d170

等等等等

我的 XML 文件的格式是:

<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解析方法如下:

 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();
     }
 }

NarrationItem 对象是一个自定义对象,定义为:

public class NarrationItem {

int ID;
String Name;
String Alias;
ArrayList<String> Narration = new ArrayList<String>(); 


public NarrationItem() { }

public void LoadNarration(int id, String name, String alias, ArrayList<String> narration) {

    ID = id;
    Name = name;
    Alias = alias;
    Narration.addAll(narration);// = narration;
}


public void Clear() {
    ID = 0;
    Name = "";
    Alias = "";
    Narration.clear();
}

  }//End Narration

如果有人能指出问题,我将非常感谢我坐在这里盯着这个问题看了几个小时。

【问题讨论】:

    标签: android xml arraylist xml-parsing hashmap


    【解决方案1】:

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

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

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

    【讨论】:

    • 我没有意识到它正在引用该对象,我每次都调用 New NarrationItem 并且“非空”项现在是正确的,是的,我正在查看调试器以查看其中的值Hashmap 表它仍然不能正常工作,但它至少使用正确的键/值对填充 hasmap - 谢谢!
    • 一切似乎都在工作,它们无法解释 Hashmap 中的空值,但由于 hashmap 是通过键而不是索引查找值,所以没关系 - 我怀疑我我看到的不是 Hashmap 的真实结构,只是 Eclipse 可以将其可视化的一种方式
    • @GideonKain:哈希图中的空值只是尚未填充的位 - 完全可以预期底层数组将相对稀疏地填充。哈希查找使用密钥的哈希码来确定要查找的存储桶。
    • @Jon 完全不相关(在这里添加这个只是因为这恰好是你现在的最新活动),我想你可能有兴趣为this question 做贡献,因为似乎没有一个明显的好答案。如果没有,请忽略我。
    • @Pekka:有趣的问题 - 希望我知道基于标准的答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 2014-09-16
    • 1970-01-01
    • 2018-10-13
    相关资源
    最近更新 更多