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

 


posted @ 2022-05-24 14:38  利娟  阅读(923)  评论(0编辑  收藏  举报