如果 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") 的方式來存取囉。
沒有留言:
張貼留言