2013-12-10 124 views
0

我試圖解析XML文檔,並且返回一個對象,名爲System。相反,對於XML文檔中的每個結束標記,都會返回新的System。我試圖將創建系統的位置移動到代碼的各個部分,但是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和setters以及toString()返回語句。 – user3000089

回答

0

那麼在XML中可以有很多結束標記。例如:

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

這裏有3個結束標籤。如果我們正在解析foo元素,那麼只要到達bar結束標記,您的當前代碼就會停止解析。

當標籤是結束標籤時,您需要檢查節點的名稱,只有當它是系統標籤時,才能完成解析。

如果您在整個文檔中只有一個「System」元素,您也可以使用XmlPullParser.END_DOCUMENT常量來檢查是否已完成解析。您在這裏有一個很好的例子:

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