本文使用XStream注解方法实现 java 类与 XML 的互转。最近项目使用到了这个功能在此记录一下。
1.引入依赖
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.7</version>
</dependency>
2.编写XML工具类
public class XmlUtils {
//java类转XML
public static String BeanToXml(Object obj) {
XStream xstream = new XStream(new DomDriver("utf8"));
xstream.processAnnotations(obj.getClass()); // 识别obj类中的注解
/*
// 以压缩的方式输出XML
StringWriter sw = new StringWriter();
xstream.marshal(obj, new CompactWriter(sw));
return sw.toString();
*/
// 以格式化的方式输出XML
return xstream.toXML(obj);
}
//XML转java类
public static <T> T XMLToBean(String xmlStr, Class<T> cls) {
XStream xstream = new XStream(new DomDriver());
xstream.processAnnotations(cls);
@SuppressWarnings("unchecked")
T t = (T) xstream.fromXML(xmlStr);
return t;
}
}
3.编写实体类
@XStreamAlias("Student")
public class Student{
@XStreamAlias("age")
private int age;
@XStreamAlias("name")
private String name;
}
4.代码使用
//测试脚本
public void Test(){
//编写xml字符串
String xmlMsg="<Student>" + "<age>23</age>" + "<name>张三</name>" + "</Student>";
//xml 转 java 实体类
Student student= XmlUtils.XMLToBean(xmlMsg, Student.class);
System.out.println("age: " + student.age +" name: " + student.name);
//java类转xml
String xmlstr = XmlUtils.BeanToXml(student);
System.out.println(xmlstr);
}
5.编写过程遇到的问题
1. Xml 工具类中的 BeanToXml 方法
(1)转换成对应的类时出错,错误:java.lang.ClassCastException: 实体类路径 cannot be cast to
实体类路径,此问题是 spring 的 devtools 引起的 ,需要将以下依赖注掉即可
<!--spring-boot-devtools-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
(2)使用此方法时,如果没有设置字段属性值,转换后的 xml 字符串将会缺少某些字段。
例:
Student s = new Student();
String xmlstr = XmlUtils.BeanToXml(s);
System.out.println(xmlstr);
此时将输出,int 默认值 为 0,所以有输出值,String 为 null,没有输出字段
<Student>
<age>0</age>
</Student>
解决此问题方法只需要将 name 设置一个值即可。
例:
Student s = new Student();
s.setName("");
String xmlstr = XmlUtils.BeanToXml(s);
System.out.println(xmlstr);
此时将输出完整 xml
<Student>
<age>0</age>
<name></name>
</Student>