将webservice接口返回的xml转成Java对象
地址:http://x-stream.github.io/
AccountBalance accountBalanceXml = (AccountBalance) WsUtil.convertXmlToEntity(outParam, AccountBalance.class,"datas");
xml转实体类用到的包
<dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>xstream</artifactId> <version>1.4.4</version> </dependency>
详细代码如下:
public class WsUtil { /** * XML转实体类 * * @param xml 要转换的xml字符串 * @param clazz 实体类 * @param aliasName 别名(与xml名字对应) */ public static Object convertXmlToEntity(String xml, Class<?> clazz, String aliasName) throws Exception { if (xml != null && !"".equals(xml)) { MyXStream bodyxs = new MyXStream (); //设置reference模型,不引用 bodyxs.setMode(1001); bodyxs.processAnnotations(new Class[0]); bodyxs.autodetectAnnotations(true); if (aliasName != null && !"".equals(aliasName)) { //为类名节点重命名 bodyxs.alias(aliasName, clazz); } //XML反序列化 return bodyxs.fromXML(xml); } else { throw new Exception("转换XML到实体失败,XML不能为空!"); } } }
/**
* 自定义转换流
*/
public class MyXStream extends XStream { public AisinoXStream() { super(new DomDriver()); } @Override protected MapperWrapper wrapMapper(MapperWrapper next) { return new MapperWrapper(next) { @Override public boolean shouldSerializeMember(Class definedIn, String fieldName) { if (definedIn == Object.class) { return false; } else { return "fileName".equals(fieldName) ? false : super.shouldSerializeMember(definedIn, fieldName); } } }; } }
要转换的XML格式如下:
<?xml version=\"1.0\" encoding=\"utf-8\"?> <datas> <errorMessage/> <data> <head> <orgcode>GS-10001</orgcode> <orgname>AAA-科技有限公司</orgname> </head> <body> <zbcode>AAA-001</zbcode> <zbname>AAA-科技有限公司-A部门</zbname> <kmcode>KC0001</kmcode> <ywlxbmmc>销售模式</ywlxbmmc> <srlxbmmc>电商</srlxbmmc> </body> <body> <zbcode>AAA-002</zbcode> <zbname>AAA-科技有限公司-B部门</zbname> <kmcode>KC0002</kmcode> <ywlxbmmc>收款模式</ywlxbmmc> <srlxbmmc>数字货币</srlxbmmc> </body> </data> </datas>
对应的实体类:
注解说明:
@XStreamImplicit(itemFieldName = "data"):隐式集合,itemFieldName 后面跟的是XML中内容为集合的标签名
@XStreamAlias("zbcode"):属性值是xml标签的标签名
@XStreamAlias("datas") public class AccountBalance { @XStreamAlias("errorMessage") private String errorMessage;
@XStreamImplicit(itemFieldName = "data") private List<FzyeDTO> fzyeDtos; }
@XStreamAlias("data") public class FzyeDTO { @XStreamAlias("head") private OrgMessDTO orgMessDto; @XStreamImplicit(itemFieldName = "body") private List<KjkmDTO> kjkmDtos; }
@XStreamAlias("body") public class KjkmDTO { @XStreamAlias("zbcode") private String zbcode; @XStreamAlias("zbname") private String zbname; @XStreamAlias("kmcode") private String kmcode; @XStreamAlias("bmbmmc") private String bmbmmc; @XStreamAlias("ywlxbmmc") private String ywlxbmmc; @XStreamAlias("srlxbmmc") private String srlxbmmc; }