2013-12-10 3 views
0

Я пытаюсь разобрать XML-документ и вернуть один объект с именем System. Вместо этого для каждого конечного тега в документе XML и возвращается новая система. Я попытался переместиться туда, где я создаю Систему, в разные части кода, но либо объект System будет только нулями, либо будет ошибка, связанная с возвратом. Вот исходный код, прежде чем я попытался пошевелиться, где я создал систему:XmlPullParser возвращает слишком много объектов

private System readEntry(XmlPullParser parser) throws XmlPullParserException, IOException { 
     //TODO Make it return one system per time through, not multiple after every end tag 
     parser.require(XmlPullParser.START_TAG, ns, null); 
     String systemName = null; 
     String rightAscension = null; 
     String declination = null; 
     String distance = null; 
     while (parser.getEventType() != XmlPullParser.END_TAG) { 
      if (parser.getEventType() != XmlPullParser.START_TAG) { 
       Log.i("String", "Start Tag Added"); 
       continue; 
      } 
      String name = parser.getName(); 
      if (name.equalsIgnoreCase("name")) { 
       Log.i("Name:", "Name added to parser"); 
       systemName = readName(parser); 
      } else if (name.equalsIgnoreCase("rightascension")) { 
       Log.i("RAscen:", "Right Ascension added to parser"); 
       rightAscension = readRightAscension(parser); 
      } else if (name.equalsIgnoreCase("declination")) { 
       Log.i("Dec:", "Declination added to parser"); 
       declination = readDeclination(parser); 
      } else if (name.equalsIgnoreCase("distance")) { 
       Log.i("Distance:", "Distance added to parser"); 
       distance = readDistance(parser); 
      } else { 
       Log.i("Skip: ", "String Skipped"); 
       skip(parser); 
      } 
     } 
     Log.i("Parser", "New System Added to be displayed"); 
     return new System(systemName, rightAscension, declination, distance); 
    } 

Как изменить код так, чтобы в конце кода только одна система возвращается? Спасибо! Вот мой код, где вызывается readSystem:

public List<System> parse(InputStream is) throws XmlPullParserException, IOException { 
    XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
    factory.setNamespaceAware(true); 
    XmlPullParser parser = factory.newPullParser(); 
    Log.i("Parser", "Parser created"); 
    try { 
     //factory = XmlPullParserFactory.newInstance(); 
     // factory.setNamespaceAware(true); 
     // parser = factory.newPullParser(); 

     parser.setInput(is, null); 
     parser.nextTag(); 
     Log.i("System:", "readSystem called"); 
     return readSystem(parser); 
    } finally { 
     is.close(); 
     Log.i("InputStream", "InputStream Closed"); 
    } 
} 
    private List readSystem(XmlPullParser parser) throws XmlPullParserException, IOException { 
    List systems = new ArrayList(); 
     parser.require(XmlPullParser.START_TAG, ns, "system"); 
     Log.i("Parser", "Passed parser.require"); 
    String name = parser.getName(); 
    Log.i("parser", "getName() Called"); 
    while (parser.next() != XmlPullParser.END_TAG) { 
     if (parser.getEventType() != XmlPullParser.START_TAG) { 
      Log.i("readSystem", "Start Tag Continue called"); 
      continue; 
     } 
     if (name.equalsIgnoreCase("system")) { 
      Log.i("String", "System added to parser"); 
      systems.add(readEntry(parser)); 
     } else { 
      Log.i("String", "No system to add, skipped, no readEntry called"); 
      skip(parser); 
     } 

    } 
    return systems; 
} 
+0

добавить все те, к классу список и после системы и код, с которого вы звоните 'readEntry'. – Raghunandan

+0

Я добавил код, класс System - это просто getters и seters и оператор toString() return. – user3000089

ответ

0

В XML может быть много конечных тегов. Например:

<foo> 
     <bar></bar> 
     <baz></baz> 
    </foo> 

Здесь у нас есть три конечных тега. Если бы мы анализировали элемент foo, то с вашим текущим кодом вы прекратите синтаксический анализ, как только будет достигнут конечный тег bar.

Вам нужно проверить имя узла, когда тег является конечным тегом, и только если он является системным тегом, завершите синтаксический разбор.

Если у вас есть только элемент «Система» во всем документе, вы также можете использовать константу XmlPullParser.END_DOCUMENT, чтобы проверить, завершили ли вы разбор. У вас есть хороший пример здесь:

http://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html

Смежные вопросы