1. 程式人生 > >Android XML轉成物件Object,只需一行程式碼

Android XML轉成物件Object,只需一行程式碼

網上對於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);