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;
}