2012年9月26日 星期三

Android 開發筆記 - 處理 API 回應 XML 資料的通用解法

如果 API 不是定義的很好,回應得資料格式不依,但至少有符合簡易的 XML 雛形,如:


<name>changyy</name>
<url>http://changyy.pixnet.net</url>
<style>blog</style>


並且很多支 API 格式都不一樣時,就會讓人想看看有沒統一解法,不小心就想到 Javascript property 的用法,可惜我對 Java 不熟,暫時就先用個 map 來處理了:


import java.io.IOException;
import java.io.StringReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;


import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;


public class QueryReturnObject {
       private Map<String,String> properties = new HashMap<String,String>();
       public QueryReturnObject(String xml) {
              parsing(xml);
       }
       public String getProperty(String key) {
              if( key == null || !properties.containsKey(key) )
                     return null;
              return properties.get(key);
       }
       public String toString() {
              if( properties.size() == 0 )
                     return "No Properties";
              String out = "";
              for( Iterator<Entry<String, String>> it = properties.entrySet().iterator() ; it.hasNext() ; ) {
                     Entry<String, String> item = it.next();
                     out += "Key=["+item.getKey()+"], Value=["+item.getValue()+"]\n";
              }
              return out;
       }
       void parsing(String raw) {
              properties.clear();
              try {
                     XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
                     XmlPullParser parser = factory.newPullParser();
                     parser.setInput( new StringReader ( raw ) );
                     int eventType = parser.getEventType();
                     String fieldName = null;
                     while( eventType != XmlPullParser.END_DOCUMENT ) {
                            switch(eventType) {
                                   case XmlPullParser.START_DOCUMENT:
                                          break;
                                   case XmlPullParser.START_TAG:
                                          fieldName = parser.getName();
                                          break;
                                   case XmlPullParser.END_TAG:
                                          fieldName = null;
                                          break;
                                   case XmlPullParser.TEXT:
                                          if( fieldName != null )
                                                 properties.put(fieldName, parser.getText());
                                          break;
                            }
                            eventType = parser.next();
                     }
              } catch (XmlPullParserException e) {
                     e.printStackTrace();
              } catch (IOException e) {
                     e.printStackTrace();
              }
       }
}


如此一來,任何 API 回應的資料,就直接用 data = new QueryReturnObject(response) 來使用,接著就可以用 data.getProperty("Key") 的方式來存取囉。


沒有留言:

張貼留言