利用反射機制解決通用xml的解析

import java.lang.reflect.Field;

import java.util.Date;

 

public class ParserUtil {

 

	/**

	 * 

	 * @param field  屬性

	 * @param value 值

	 * @return 返回相應類型

	 * @throws Exception

	 */

	public static Object getArgus(Field field, String value) throws Exception {

		Object obj = null;

		if (field.getGenericType().toString().equals("class java.lang.String")) {

			return value;

		}

		if (field.getGenericType().toString().equals("class java.lang.Integer")) {

			return Integer.parseInt(value);

		}

		if (field.getGenericType().toString().equals("class java.lang.Double")) {

			return Double.parseDouble(value);

		}

		if (field.getGenericType().toString().equals("class java.lang.Boolean")) {

			return Boolean.parseBoolean(value);

		}

		if (field.getGenericType().toString().equals("boolean")) {

			return Boolean.parseBoolean(value);

		}

		if (field.getGenericType().toString().equals("int")) {

			return Integer.parseInt(value);

		}

		if (field.getGenericType().toString().equals("class java.util.Date")) {

			return Date.parse(value);

		}

		if (field.getGenericType().toString().equals("class java.lang.Short")) {

			return Short.parseShort(value);

		}

			return obj;

	}

}

 

 

 

import java.io.InputStream;

import java.lang.reflect.Field;

import java.util.ArrayList;

import java.util.List;

 

import org.xmlpull.v1.XmlPullParser;

 

import android.util.Log;

import android.util.Xml;

 

public class ReflectParser {

	private InputStream is = null;

	private ArrayList<Object> list = null;

	/**

	 * 構造方法傳參

	 * @param is 文件輸入流

	 */

	public ReflectParser(InputStream is) {

		this.is = is;

	}

 

	/**

	 * @param encoding xml的編碼格式

	 * @param clazz 實體對象的反射

	 * @return 對象的集合

	 * @throws Exception  XmlPullParserException, InstantiationException, IllegalAccessException, IOException 和所調方法的異常

	 */

	public List<Object> getObjects(String encoding, Class clazz) throws Exception{

		list = new ArrayList<Object>();

		XmlPullParser parser = Xml.newPullParser();

		parser.setInput(is, encoding);

		int event = parser.getEventType();

		//聲明對象的引用1

		Object object = null;

		// 獲取類名和父標籤

		String name = clazz.getName();// 2

		String root = name

		.subSequence(name.lastIndexOf(".") + 1, name.length())

		.toString();// 3

		while (XmlPullParser.END_DOCUMENT != event) {

		switch (event) {

			case XmlPullParser.START_TAG:

			Log.i("XiMoon", root);

			// 當標籤爲父標籤的時候 4

			if (root.equalsIgnoreCase(parser.getName())) {

			// 創建一個實例5

				object = clazz.newInstance();

			}

			// 設置屬性6

			getAttribute(object, parser, clazz);

			break;

			case XmlPullParser.END_TAG:

			// 將對象添加到集合中 7

			if (root.equalsIgnoreCase(parser.getName())) {

			list.add(object);

			object = null;

			}

			break;

			default:

			break;

		}

		event = parser.next();

		}

		return list;

	}

 

	/**

	 * @param object 實例化對象

	 * @param parser 解析器

	 * @param clazz 反射

	 * @throws Exception IllegalAccessException, IllegalArgumentException, XmlPullParserException, IOException, Exception

	 */

	private void getAttribute(Object object, XmlPullParser parser, Class clazz) throws Exception{

		// 獲得該類所有公共屬性

		Field[] fields = clazz.getFields();

		for (Field field : fields) {

		// 設置相應對象的屬性

			if (parser.getName().equals(field.getName())) {

				field.set(object, ParserUtil.getArgus(field, parser.nextText()));

				break;

			}

		}

	}

}



 

說明:

 

1.ReflectParser類的作用

構造方法傳一個xml文件對應的輸入流之後,調用getObject()方法即可解析成相應的一個Objectlist集合,其中String encoding 指定文件的編碼格式, Class clazz 指定實體的反射 (也可以傳實體對象,然後通過getClass()方法獲取反射)

2.ParserUtil類的作用

 

xml獲得的內容解析成實體字段對應的類型並返回

3.獲得List<Object>集合之後,通過循環逐個強轉爲Bean再添加到新定義的List集合中即可

List<JavaBean> newList = new ArrayList<JavaBean>();

JavaBean bean = null;

for (Object object : list) {

bean = (JavaBean)object;

newList.add(bean);

}

:

1.實體的屬性一定用public方法修飾

2.父標籤名和實體名一致(忽視大小寫區分)

3.子標籤名和實體屬性名一致(忽視大小寫區分)

4.xml文件採用無屬性的方式構建(有屬性參照以下方法修改代碼,root指實體類名或者父標籤名,object在解析之前已經聲明)

if (root.equalsIgnoreCase(parser.getName())) {

// 創建一個實例

object = clazz.newInstance();//5

// 獲取屬性數量

count = parser.getAttributeCount();

for (int i = 0; i < count; i++) {

Field f = object.getClass().getField(parser.getAttributeName(i));

// 此處設置值的時候一定要記得轉換類型

f.set(object, getArgus(f, parser.getAttributeValue(i)));

}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章