网上对于XML的数据解析眼花缭乱,用起来也不方便,今天正好有时间封装了下,基于pull解析,只需一行代码即可实现XML转换Object
Parser接口
import java.io.InputStream;
/**
* Created by zhao on 2017/4/8.
*/
public interface Parser<T> {
/**
* 解析输入流 得到对象
* @param is
* @return
* @throws Exception
*/
T parse(InputStream is,Class<T> c) throws Exception;
/**
* 序列化对象 得到XML形式的字符串
* @param t
* @return
* @throws Exception
*/
String serialize(T t) throws Exception;
}
Parser实现,这里Object转XML没有做实现,待更新,有兴趣的小伙伴也可以自己实现下
import android.util.Xml;
import org.xmlpull.v1.XmlPullParser;
import java.io.InputStream;
import java.lang.reflect.Field;
/**
* Created by zhao on 2017/4/8.
*/
public class PullParser<T> implements Parser<T> {
@Override
public T parse(InputStream in,Class<T> c) throws Exception {
T t = c.newInstance();
Class weaClass = t.getClass();
Field[] fs = weaClass.getDeclaredFields();
XmlPullParser parser = Xml.newPullParser(); //由android.util.Xml创建一个XmlPullParser实例
parser.setInput(in, "UTF-8"); //设置输入流 并指明编码方式
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
for(int i = 0 ; i < fs.length; i++){
Field f = fs[i];
f.setAccessible(true); //设置些属性是可以访问的
if (parser.getName().equals(fs[i].getName())) {
eventType = parser.next();
f.set(t,parser.getText());
break;
}
}
break;
case XmlPullParser.END_TAG:
break;
}
eventType = parser.next();
}
return t;
}
@Override
public String serialize(T t) throws Exception {
return null;
}
}
面向开发者的Xml2Obj
import java.io.ByteArrayInputStream;
/**
* Created by zhao on 2017/4/21.
*/
public class Xml2Obj {
public static <T> T fromXml(String xml,Class<T> c) throws Exception {
return new PullParser<T>().parse(new ByteArrayInputStream(xml.getBytes("UTF-8")),c);
}
}
最后实现xml转object只需要这么一行代码,把Objcet替换成相应的实体即可
Objcet obj = Xml2Obj.fromXml(response.toString(),Objcet.class);