使用jaxb对xml报文进行解析和组装

通常对接的时候报文协议会给定固定的.xsd后缀的报文规范,我们可以使用jdk自带的xjc来生成指定的java bean文件,使用之前需要将xjc.exe添加到环境变量中,如果这个不会,自己去网上搜一下。环境变量配置。

命令:xjc [.xsd文件目录,如X/test/*.xsd] -p [包名,如com.xx.xx.xx] -d [生成的目标文件夹] -encoding utf-8 [指定解析编码格式]

以上这些都很简单,问题在下面:

如果对生成的都不满意,比如,有好多共有的节点需要提取出来,那么我们就要进行一次封装。这时会出现问题,如:子节点调用的是其他的javaBean,这样生成的子节点中就会带有ns2,ns3之类的前缀。去掉的方法如下:

在javaBean的同级目录下创建文件package-info.java  内容如下。

@javax.xml.bind.annotation.XmlSchema(xmlns={@XmlNs(prefix="",namespaceURI="http://www.chinaport.gov.cn/Exp")})
package com.metinform.hbexpress.net.data;

import javax.xml.bind.annotation.XmlNs;

其中prefix的值就是你想要的前缀,如果不想要则置位空。

之后我们会用到工具类进行xml和javaBean之间的转换。

import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
/**
 * @author jinglonglong
 * Jaxb工具类 xml和java类相互转换
 * data 2019/4/9
 **/

public class JaxbXmlUtil {

    public static final String DEFAULT_ENCODING = "UTF-8";

    /**
     * pojo转换成xml 默认编码UTF-8
     *
     * @param obj 待转化的对象
     * @return xml格式字符串
     * @throws Exception JAXBException
     */
    public static String convertToXml(Object obj) throws Exception {
        return convertToXml(obj, DEFAULT_ENCODING);
    }

    /**
     * pojo转换成xml
     *
     * @param obj 待转化的对象
     * @param encoding 编码
     * @return xml格式字符串
     * @throws Exception JAXBException
     */
    public static String convertToXml(Object obj, String encoding) throws Exception {
        String result = null;

        JAXBContext context = JAXBContext.newInstance(obj.getClass());
        Marshaller marshaller = context.createMarshaller();

        marshaller.setListener(new MarshallerListener());

        // 指定是否使用换行和缩排对已编组 XML 数据进行格式化的属性名称。
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);

        StringWriter writer = new StringWriter();
        marshaller.marshal(obj, writer);
        result = writer.toString();

        return result;
    }

    /**
     * xml转换成JavaBean
     *
     * @param xml xml格式字符串
     * @param t 待转化的对象
     * @return 转化后的对象
     * @throws Exception JAXBException
     */
    @SuppressWarnings("unchecked")
    public static <T> T convertToJavaBean(String xml, Class<T> t) throws Exception {
        T obj = null;

        JAXBContext context = JAXBContext.newInstance(t);
        Unmarshaller unmarshaller = context.createUnmarshaller();
        obj = (T) unmarshaller.unmarshal(new StringReader(xml));
        return obj;
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值