Android разбора XML в хэш-карту не работает - PullRequest
0 голосов
/ 30 сентября 2011

Я получаю самое странное поведение при попытке разобрать 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

Если кто-то может указать на проблемуЯ был бы очень благодарен, что сидел здесь и смотрел на этот вопрос часами.

1 Ответ

3 голосов
/ 30 сентября 2011

Вы создаете только один объект NarrationItem - тогда вы используете ссылку на этот объект в качестве значения для нескольких записей на карте.Не делай этого.Вы должны понимать, что карта не содержит объект в качестве значения - она ​​содержит ссылку на объект.

Вероятно, это можно исправить простосоздание нового NarrationItem каждый раз вместо вызова Clear.

Не ясно, как вы смотрите на карту, чтобы увидеть эти нулевые значения, но если вы используете отладчик и смотрите навнутренняя структура данных, вы, вероятно, не должны этого делать - вместо этого пошагово просматривайте ключи, значения или записи, то есть придерживайтесь абстракции, которую HashMap предназначен для поддержки.

...