为了方便使用,动态的解析xml,近日写了动态解析XML的类,上代码
/**
* 动态解析XML
* @param obj 解析header部分的bean
* @param cla 解析message内容的bean类
* @param xmlString 传过来的xml
* @return
*/
public static List TNTResolveXML(Object obj, Class cla, String xmlString) {
List resultList = new ArrayList();// 返回List
String isGetMessage = null; // 标志是否开始获取内容
try {
Object clabean = cla.newInstance();
XmlPullParser parser = Xml.newPullParser();
parser.setInput(new StringReader(xmlString));
int event = parser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_TAG:
if (parser.getName().equals("obj")) {
isGetMessage = "y";
}
// 首先解析头部返回的CODE等信息
if (isGetMessage == null) {
Field[] fields = obj.getClass().getDeclaredFields();// 根据Class对象获取属性
Method[] methods = obj.getClass().getDeclaredMethods();// 根据Class对象获取所有方法
for (Field f : fields) {
if (f.getName().equals(parser.getName())) {
for (Method method : methods) {
String meth = method.getName();
// 匹配set方法
if (meth != null
&& "set".equals(meth
.substring(0, 3))
&& Modifier.isPublic(method
.getModifiers())
&& ("set"
+ Character.toUpperCase(f
.getName()
.charAt(0)) + f
.getName().substring(1))
.equals(meth)) {
// 调用set方法并赋值
method.invoke(obj, parser.nextText());
}
}
}
}
}
if (isGetMessage != null && isGetMessage.equals("y")) {
Method methd = obj.getClass().getMethod("getCode");
methd.invoke(obj);
if (methd.invoke(obj) != null) {
if (methd.invoke(obj).equals("100")) {
Field[] cla_fields = clabean.getClass()
.getDeclaredFields();// 根据Class对象获取属性
Method[] cla_methods = clabean.getClass()
.getDeclaredMethods();// 根据Class对象获取所有方法
for (Field cla_f : cla_fields) {
if (cla_f.getName()
.equals(parser.getName())) {
for (Method cla_method : cla_methods) {
String meth = cla_method.getName();
// 匹配set方法
if (meth != null
&& "set".equals(meth
.substring(0, 3))
&& Modifier
.isPublic(cla_method
.getModifiers())
&& ("set"
+ Character
.toUpperCase(cla_f
.getName()
.charAt(0)) + cla_f
.getName()
.substring(1))
.equals(meth)) {
// 调用set方法并赋值
cla_method.invoke(clabean,
parser.nextText());
}
}
}
}
}
}
}
break;
case XmlPullParser.END_TAG:
if (parser.getName().equals("obj")
&& parser.getName() != null) {
resultList.add(clabean);
clabean = cla.newInstance();
}
default:
break;
}
event = parser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
return resultList;
}