import org.dom4j.*;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
/**
* ClassName: XmlUtils
* Date: 2021/12/23、10:41
*/
public class XmlUtils {
/**
* 解析xml
* @param xml
*/
public static Object getXml(String xml,Class<?> model) throws Exception{
Document document = DocumentHelper.parseText(xml);
// Object o = modelClass.newInstance();
// Class<?> model = o.getClass();
Object o = model.newInstance();
//获取根节点
Element root = document.getRootElement();
//获取根节点名称
String name = root.getName();
//获取根节点属性
List<Attribute> attributes = root.attributes();
//给对象属性赋值
Field[] field = model.getDeclaredFields();
//获取子节点
List<Element> elements = root.elements();
// 组装根节点属性
attributes.forEach(attribute -> {
//根节点属性名称
String rootAttributeName = attribute.getName();
//根节点属性值
String value = attribute.getValue();
try {
for (int j = 0; j < field.length; j++) { // 遍历所有属性
String name1 = field[j].getName(); // 获取属性的名字
Type genericType = field[j].getGenericType();
String type = genericType.toString(); // 获取属性的类型
if (name1.equals(rootAttributeName)){
/**************************************根节点元素***************************************************/
if (type.equals("class java.lang.String")) {
name1 = name1.substring(0, 1).toUpperCase() + name1.substring(1); // 将属性的首字符大写,方便构造get,set方法
Method m = model.getDeclaredMethod("set" + name1, String.class);
m.invoke(o, value);
} //如果是其他类型 需要的自己添加
/**************************************根节点元素***************************************************/
}
/*****************************************子节点元素********************************/
if (type.contains("java.util.List")){
List list1 = new ArrayList();
name1 = name1.substring(0, 1).toUpperCase() + name1.substring(1);
elements.forEach(element -> {
try{
//获取子节点名称
String elementName = element.getName();
//获取子节点值
String text = element.getText();
//获取子节点属性
List<Attribute> elementAttributes = element.attributes();
if (genericType instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) genericType;
//得到泛型里的class类型对象
Class<?> genericClazz = (Class<?>) pt.getActualTypeArguments()[0];
Object o1 = genericClazz.newInstance(); //获取子类实例
Field[] declaredFields = genericClazz.getDeclaredFields(); //获取子类方法
//子节点属性赋值
elementAttributes.forEach(elementAttribute->{
String text1 = elementAttribute.getText();
//子节点属性名称
String elementAttributeName = elementAttribute.getName();
//将子节的属性放入子类属性中
for (Field field1 : declaredFields){
try{
//属性名称
String field1Name = field1.getName();
if (field1Name.equals(elementAttributeName)){
field1Name = field1Name.substring(0, 1).toUpperCase() + field1Name.substring(1); // 将属性的首字符大写,方便构造get,set方法
Type genericType1 = field1.getGenericType();
String type1 = genericType1.toString(); // 获取属性的类型
if (type1.equals("class java.lang.String")) { // 如果type是类类型,则前面包含"class ",后面跟类名
//Method m = model.getDeclaredMethod("get" + name1);
// String value1 = (String) m.invoke(model); // 调用getter方法获取属性值
Method m1 = genericClazz.getDeclaredMethod("set" + field1Name, String.class);
m1.invoke(o1, text1);
} //如果是其他类型 需要的自己添加
list1.add(o1);
}
}catch(Exception e){
e.printStackTrace();
}
}
});
}
}catch (Exception e){e.printStackTrace();}
});
// type
Method m = model.getDeclaredMethod("set" + name1, List.class);
m.invoke(o, list1);
}
/*****************************************子节点元素********************************/
}
}catch (Exception e) {
e.printStackTrace();
}
});
return o;
}
}
解析xml转对象(适用于根节点和一级节点)
最新推荐文章于 2023-06-24 17:37:02 发布