java操作XML字符串 简单、复杂字符串,对象接收,对象集合接收

java操作XML字符串

注意:用于接收xml解析后的对象,其属性名必须与对象节点名一致!

利用java反射及正则表达式匹配,与xml的高度无关。

1.操作简单xml字符串,获取对象。

工具类

    /**
     * @Description: 解析xml字符串,用对象接收。要求接收的对象的属性名与xml的节点名一致
     * @Param: [obj 解析xml后封装到的对象, xmlStr xml字符串]
     * @return: java.lang.Object
     */
    public static Object parseXmlStrToObject(Object obj, String xmlStr) {
        //获取对象的所有属性
        Field[] fields = obj.getClass().getDeclaredFields();
        //遍历属性
        for (Field field : fields) {
            //设置属性障碍
            field.setAccessible(true);
            //得到属性名
            String fieldname = field.getName();
            try {
                //用属性名匹配xml中的节点
                Pattern p = Pattern.compile("<" + fieldname + ">.*?</" + fieldname + ">");
                Matcher matcher = p.matcher(xmlStr);
                while (matcher.find()) {
                    //匹配节点值
                    Matcher m1 = PATTERN.matcher(matcher.group(0).trim());
                    if (m1.find()) {
                        //拿到属性的值
                        String value = "".equals(m1.group(1).trim()) ? null : m1.group(1).trim();
                        //取属性类型
                        Class<?> beanType = field.getType();
                        //拼串,得到属性的setter方法名
                        String setMethodName = "set" + fieldname.substring(0, 1).toUpperCase() + fieldname.substring(1);
                        //得到属性的setter方法
                        Method m = obj.getClass().getMethod(setMethodName, beanType);
                        //调用setter方法
                        m.invoke(obj, value);
                    }
                }
            } catch (Exception e) {
                continue;
            }
        }
        return obj;
    }

测试类

public static void main(String[] args) {
        String xml = "<root><username>测试用户名</username><password>测试密码</password></root>";
        Object obj = XMLUtil.parseXmlStrToObject(new TestDTO(), xml);
        System.out.println(obj);
    }
@Data
public class TestDTO {
    private String username;
    private String password;
}

2.操作较复杂xml,获取对象集合

工具类

/**
     * @Description: 解析xml字符串,返回对象集合
     * @Param: [obj, xmlStr]
     * @return: java.util.List<com.jdkj.detectSystem.Util.BaseObject>
     */
    @SneakyThrows
    public static List<BaseObject> parseXmlStrToObjectList(BaseObject obj, String xmlStr) {
        Field[] fields = obj.getClass().getDeclaredFields();
        List<Object> objs = new ArrayList<>();
        //临时变量,用于计算可匹配到的对象数目
        int count = 0;
        for (Field field : fields) {
            field.setAccessible(true);
            String fieldname = field.getName();
            Pattern p = Pattern.compile("<" + fieldname + ">.*?</" + fieldname + ">");
            Matcher matcher = p.matcher(xmlStr);
            while (matcher.find()) {
                //对象的复制方法
                Object _obj = obj.clone();
                objs.add(_obj);
                count++;
            }
            if (count > 0) {
                //一旦获取到对象数组,结束循环
                break;
            }
        }
        BaseObject[] objs2 = new BaseObject[count];
        for (int i = 0; i < count; i++) {
            Object obj1 = objs.get(i);
            for (Field field : fields) {
                field.setAccessible(true);
                String fieldname = field.getName();
                try {
                    Pattern p = Pattern.compile("<" + fieldname + ">.*?</" + fieldname + ">");
                    Matcher matcher = p.matcher(xmlStr);
                    int num = 0;
                    while (matcher.find()) {
                        if (num == i) {
                            Matcher m1 = PATTERN.matcher(matcher.group(0).trim());
                            if (m1.find()) {
                                String value = "".equals(m1.group(1).trim()) ? null : m1.group(1).trim();
                                Class<?> beanType = field.getType();
                                String setMethodName = "set" + fieldname.substring(0, 1).toUpperCase() + fieldname.substring(1);
                                Method m = obj1.getClass().getMethod(setMethodName, beanType);
                                m.invoke(obj1, value);
                            }
                        }
                        num++;
                    }
                } catch (NullPointerException e) {
                    continue;
                }
            }
            objs2[i] = (BaseObject) obj1;
        }
        return Arrays.asList(objs2);
    }

测试类

public class Test01 {

    public static void main(String[] args) {
        String xml = "<root>" +
                        "<username>测试用户名1</username><password>测试密码1</password>" +
                        "<username>测试用户名2</username><password>测试密码2</password>" +
                        "<username>测试用户名3</username><password>测试密码3</password>" +
                     "</root>";
        List<BaseObject> list = XMLUtil.parseXmlStrToObjectList(new TestDTO(), xml);
        list.forEach(System.out::println);
    }
}
@Data
public class TestDTO extends BaseObject {
    private String username;
    private String password;
}
public class BaseObject implements Cloneable {
    @Override
    public Object clone() {
        Object obj = null;
        try {
            obj = super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return obj;
    }
}

3.复杂xml,获取对象及对象集合

<root>
    <code>1</code>
    <user>
        <username>测试用户名1</username><password>测试密码1</password>
    </user>
    <user>
        <username>测试用户名2</username><password>测试密码2</password>
    </user>
    <user>
        <username>测试用户名3</username><password>测试密码3</password>
    </user>
</root>"
//调用 2 介绍的较复杂xml,用此类接收,可得到xml中重复的user对象集合
@Data
public class TestDTO extends BaseObject {
    private String username;
    private String password;
}
//调用 1 介绍的简单xml,用此类接收,可得到xml中非重复的code
@Data
public class TestDTO2 {
    private String code;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值