xml 与 Java bean的互相转换
依赖
<dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.15</version></dependency>
xml -> bean
创建XStream对象
XStream xStream = new XStream(new StaxDriver());//安全配置,允许所有类型XStream.setupDefaultSecurity(xStream);xStream.allowTypesByRegExp(new String[]{".*"});//设定node节点对应的名称和java类型xStream.alias("X1Request", X1Request.class);//打开注解支持xStream.autodetectAnnotations(true);//xml转换为beanX1Request o = (X1Request) xStream.fromXML(new File(xmlPath));
整个转换过程中,xml节点的前的命名空间会被忽略
对于集合类型的属性,需要增加注解,请参照下方bean -> xml中相关描述
bean -> xml
调用方法
//设定root节点名称为附带命名空间xStream.alias("ns1:X1Request", X1Request.class);//javabean 转xmlString xml = xStream.toXML(o);
因为需要在每个节点增加命名空间前缀,对所有属性使用@XStreamAlias注解
@XStreamAlias("ns1:x1RequestMessage")private X1RequestMessage x1RequestMessage;
对于集合类型的属性,需要在属性上增加如下注解XStreamImplicit,如果没有,会造成xml转bean报错或无法赋值
同时,泛型类型上需要增加别名,否则xml中为包路径
@XStreamImplicitprivate List<TargetIdentifier> targetIdentifier;//同时需要在子类型上增加别名@XStreamAlias("ns1:targetIdentifier")public class TargetIdentifier {
正确的输出
<ns1:targetIdentifiers><ns1:targetIdentifier><ns1:e164Number>447700900000</ns1:e164Number></ns1:targetIdentifier></ns1:targetIdentifiers>
错误的输出
<ns1:targetIdentifiers><com.example.demo.bean.TargetIdentifier><ns1:e164Number>447700900000</ns1:e164Number></com.example.demo.bean.TargetIdentifier></ns1:targetIdentifiers>
对于集合类型,但泛型为String/Long等简单类型,只需要在XStreamImplicit的属性itemFieldName设定输出后的属性名称即可
@XStreamImplicit(itemFieldName = "ns1:dID")private List<String> dId;
正确的输出
<ns1:listOfDIDs><ns1:dID>19867c20-8c94-473e-b9cd-8b72b7b05fd4</ns1:dID></ns1:listOfDIDs>
错误的输出
<ns1:listOfDIDs><string>19867c20-8c94-473e-b9cd-8b72b7b05fd4</string></ns1:listOfDIDs>
命名空间,在命名空间对应属性赋值,并添加XStreamAlias和XStreamAsAttribute注解
因为xstream是通过unsafe.allocateInstance,直接生成对象,会跳过一切初始化代码,包括静态代码块和new 方法,所以命名空间对应属性需要手动调用方法赋值
@XStreamAlias("xmlns:ns")@XStreamAsAttributeprivate String ns;@XStreamAlias("xmlns:xsi")@XStreamAsAttributeprivate String xsi;public void setNameSpace(){this.ns = "http://uri.etsi.org/03221/X1/2017/10";this.xsi = "http://www.w3.org/2001/XMLSchema-instance";}
输出结果
<ns1:X1Requestxmlns:ns="http://uri.etsi.org/03221/X1/2017/10"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
