解析xml转对象(适用于根节点和一级节点)


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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值