Android XML轉成物件Object,只需一行程式碼
阿新 • • 發佈:2019-01-29
網上對於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);