虽然目前绝大多数情况传递参数都是使用JSON进行传递,但是也不排除存在XML的可能性,今天带来一个使用XStream进行对XML字符串和Entity之间的相互转换,希望可以帮到大家。
基于环境(关键):Maven
- 1:首先加入相关依赖
<!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.11.1</version>
</dependency>
- 2:创建需要转换的实体类
//lombok插件
@Data
//该代码是指的是根节点的名称 如果不指定 就会默认是 yq.entity.XML.TestXmlEntity 完整名
@XStreamAlias("testXmlEntity")
public class TestXmlEntity {
//该属性就当做 xml中的属性使用 该注解就是当做属性实行
@XStreamAsAttribute
private String id;
//这就是xml中的子节点
private List<TestXmlEntityChildren> testXmlEntityChildrens;
}
@Data
//设置属性的别名
@XStreamAlias("testXmlEntityChildren")
public class TestXmlEntityChildren {
private String name;
private String age;
private String sex;
}
- 3:创建测试类进行测试
public class Test {
private static XStream xStream = null;
public static void main(String[] args) {\
//创建一些测试数据
TestXmlEntityChildren zhangsan = new TestXmlEntityChildren("张三","18","男");
TestXmlEntityChildren xiaohong = new TestXmlEntityChildren("小红","18","女");
List<TestXmlEntityChildren> testXmlEntityChildrens = new ArrayList<>();
testXmlEntityChildrens.add(zhangsan);
testXmlEntityChildrens.add(xiaohong);
TestXmlEntity testXmlEntity = new TestXmlEntity(IdUtil.createId(),testXmlEntityChildrens);
//调用方法转换为String
String s = entityToString(testXmlEntity);
System.out.println(s);
//调用方法转换为Entity
TestXmlEntity o = (TestXmlEntity) xmlStrToEntity(s);
System.out.println(o.toString());
}
//实体类转换为xml
public static String entityToString(Object object){
initXStream();
//得到转换的字符串
String xmlStr = xStream.toXML(object);
//因为字符串中的下划线是两个下划线 所以转换的时候就需要替换下,如果字段里面没下划线那就不需要
//String replace = xmlStr.replace("__", "_");
return xmlStr;
}
//xml转换为实体类
public static Object xmlStrToEntity(String xmlStr){
initXStream();
Object obj = xStream.fromXML(xmlStr);
return obj;
}
//初始化XStream
public static void initXStream(){
if(xStream == null){
xStream = new XStream();
//支持需要转换类中的注解
xStream.autodetectAnnotations(true);
//需要转换的所有类
Class[] classs = {TestXmlEntity.class, TestXmlEntityChildren.class};
xStream.processAnnotations(classs);
//这是单个赋值方法
//xStream.processAnnotations(TestXmlEntity.class);
}
}
}
//最后程序的运行结果为:
<testXmlEntity id="6363667337216">
<item>
<testXmlEntityChildren>
<name>张三</name>
<age>18</age>
<sex>男</sex>
</testXmlEntityChildren>
<testXmlEntityChildren>
<name>小红</name>
<age>18</age>
<sex>女</sex>
</testXmlEntityChildren>
</item>
</testXmlEntity>
=================分割线 下面是转换为entity=================
TestXmlEntity(id=6363667337216, testXmlEntityChildrens=[TestXmlEntityChildren(name=张三, age=18, sex=男), TestXmlEntityChildren(name=小红, age=18, sex=女)])
问题:那就是生成的xml中如果存在字段下面还存在字段这种(我们这里的List)虽然我们可以区别名,但是无法抹去,下面这种方法可以替换掉,但是在逆向转换为entity的时候就无法转换,所以还是要根据情况使用,如果哪位大佬可以解决这个问题,麻烦指出,谢谢。
xmlStr.replace("","");
xmlStr.replace("","");