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

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值