利用反射机制解决通用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)));

}

}

发布了23 篇原创文章 · 获赞 10 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/byxyrq/article/details/44959081