构建与解析xml报文

构建与解析xml报文

构建xml报文

描述:以前个人构建xml报文,一般会利用递归算法通过StringBuffer来进行拼接。这种情况,不需要开发者写任何的xml模板,只需要在代码层面维护参数与参数之间的关系。但是这对开发者来说,构建入参的维护需要格外仔细。同时拼接处理逻辑同样需要写大量的代码。这次用的方式通过维护xml模板与注解的方式来构建,注解是现有的jar包依赖,无需个人再次编写。

1.在xml模板通过 {name} 占位符的形式,表示需要自定义的,具体模板根据实际情况决定(构建xml报文无需注解)

<?xml version="1.0" encoding="UTF-8"?>
<service>
    <service_header>
        <!--这个参数就根据实际入参决定-->
        <service_sn>{service_sn}</service_sn>
        <service_id>1001</service_id>
    </service_header>
    <service_body>
        <request>
            <name>{name}</name>
            <age>{age}</age>
        </request>
    </service_body>
</service>

2.代码层面还是需要通过map来维护一份自定义的参数与值,key就是占位符写的name,需要保持一致,value就会被填充进去。

 Map<String ,Object> pa = new HashMap<>(4);
 pa.put("service_sn",System.currentTimeMillis());
 pa.put("name","张三");
 pa.put("age","10");

3.使用的方法是hutool工具类

String req = IoUtil.read(new ClassPathResource("xml/1001Req.xml").getInputStream(), StandardCharsets.UTF_8);
String reqXml = StrUtil.format(req, pa);
log.info("原生请求报文:[{}]", reqXml);
结果如下:
<?xml version="1.0" encoding="UTF-8"?>
<service>
    <service_header>
        <!--这个参数就根据实际入参决定-->
        <service_sn>1698200396409</service_sn>
        <service_id>1001</service_id>
    </service_header>
    <service_body>
        <request>
            <name>张三</name>
            <age>10</age>
        </request>
    </service_body>
</service>

解析xml报文

1.获取xml报文

String  res = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
                "<service>\n" +
                "    <service_header>\n" +
                "        <!--这个参数就根据实际入参决定-->\n" +
                "        <service_sn>1698395245218</service_sn>\n" +
                "        <service_id>1001</service_id>\n" +
                "    </service_header>\n" +
                "    <service_body>\n" +
                "        <name>张三</name>\n" +
                "        <age>10</age>\n" +
                "    </service_body>\n" +
                "</service>";
引用依赖
         <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
            <version>2.11.2</version>
        </dependency>

2.根据报文格式定义实体对象

@Data
@AllArgsConstructor
@NoArgsConstructor
@JacksonXmlRootElement(localName = "Service")
public class ID1001 {

    @JacksonXmlProperty(localName = "service_header")
    private Header serviceHeader;

    @JacksonXmlProperty(localName = "service_body")
    private Body serviceBody;

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class Header {

        @JacksonXmlProperty(localName = "service_sn")
        private String serviceSn;

        @JacksonXmlProperty(localName = "service_id")
        private String serviceId;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class Body {

        @JacksonXmlProperty(localName = "name")
        private String name;

        @JacksonXmlProperty(localName = "age")
        private String age;
    }

3.解析xml映射到实体对象

    /**
     * 解析响应xml报文
     *
     * @param resXml 响应报文
     * @return
     */
    public static ID1001 res1001xml(String resXml) throws JsonProcessingException {
        ID1001 response = getxmlMapper().readValue(resXml, ID1001.class);
        return response;
    }

    public static XmlMapper getxmlMapper() {
        XmlMapper xmlMapper = new XmlMapper();
        xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        return xmlMapper;
    }

4.解析实体对象赋值后如下

{
    "serviceBody":{
        "age":"10",
        "name":"张三"
    },
    "serviceHeader":{
        "serviceId":"1001",
        "serviceSn":"1698395245218"
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值