常用工具类之七 XML报文解析/验证转换等相关工具类

本文介绍了Java中处理XML的工具类,包括基于JAXBContext的报文与实体转换,处理命名空间的方法;利用MarshallerListener解决空标签问题;以及dom4j的ParseContext和Param,用于XML的格式定制、修改和验证。
摘要由CSDN通过智能技术生成


XML报文处理总结

1. 基本转换工具类

基于JAXBContext可满足报文和java实体转换的基本需求

/**
 * 版权: taylor
 * 描述: 校验工具类
 * 创建时间:2020年03月25日
 */
package com.taylor.xml.common.util;


import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Arrays;
import java.util.stream.Collectors;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.groups.Default;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import com.taylor.parsers.processor.core.listener.MarshallerListener;
import org.apache.commons.lang3.StringUtils;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;



/**
 * 类用途:校验工具类
 *
 * @author hucaihui
 * @version [V1.2, 2020年03月25日]
 * @since []
 */
public class ValidDataUtil {
   
    /** 北京时区 */
    private static final String ASIA_ZONE_ID = "+8";
    /**验证器*/
    private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
    /**
     * 校验失败提示最大长度
     */
    private static final Integer FAIL_STRING_LENGTH_MAX = 950;

    /**
     * 检查数据格式
     * @param object 需要验证的带有{@link javax.validation.constraints}注解的实体
     * @param <T> the type of the object to validate
     * @param groups the group or list of groups targeted for validation (defaults to {@link Default})
     * @return 是否验证通过 {@link Result#isSuccess()}{@code true}表示通过,不通过时{@link Result#getMsg()}获取失败信息
     */
    @NonNull
    public static <T> Result validData(@NonNull T object, Class<?>... groups) {
   
        String validateMsg = validator.validate(object,groups).stream().map(ConstraintViolation::getMessage)
                .collect(Collectors.joining(","));
        if (StringUtils.isBlank(validateMsg)) {
   
            return Result.success();
        }else  {
   
            return Result.build(Status.BAD_REQUEST,
                    validateMsg.length() > FAIL_STRING_LENGTH_MAX ? validateMsg.substring(0,FAIL_STRING_LENGTH_MAX) : validateMsg);
        }
    }
    /**
     * 将XML转为指定的POJO
     * @param clazz POJO类常量
     * @param reader 字符流
     * @param <T> 需要转换的POJO类
     * @return POJO实体 (实际一定能转换,因此忽略了转换警告)
     * @throws JAXBException XML格式异常
     */
    private static <T> T xmlReaderToObject(Class<T> clazz, Reader reader) throws JAXBException {
   
            // XML 转为对象的接口
            Unmarshaller unmarshaller = JAXBContext.newInstance(clazz).createUnmarshaller();
            return clazz.cast(unmarshaller.unmarshal(reader));
    }

    /**
     * 将报文XML样例文件转为指定的报文实体
     * @param clazz POJO类常量
     * @param path XML文件路径
     * @param <T> 需要转换的报文类
     * @return POJO实体
     * @throws IOException IO异常
     * @throws JAXBException XML格式异常
     */
    @NonNull
    public static <T > T xmlToObject(@NonNull Class<T> clazz, @NonNull String path) throws IOException, JAXBException {
   
        try (Reader reader = new InputStreamReader(clazz.getResourceAsStream(path))){
   
            return xmlReaderToObject(clazz,reader);
        }
    }
    /**
     * 将XML转为指定的POJO
     * @param clazz POJO类常量
     * @param xmlStr xml字符串
     * @param <T> 需要转换的POJO类
     * @return POJO实体 (实际一定能转换,因此忽略了转换警告)
     * @throws JAXBException XML格式异常
     * @throws IOException IO异常
     */
    @NonNull
    public static <T> T xmlStrToObject(@NonNull Class<T> clazz,@NonNull String xmlStr) throws IOException, JAXBException {
   
        try (Reader reader = new StringReader(xmlStr)){
   
            return xmlReaderToObject(clazz,reader);
        }
    }

    /**
     * 将POJO转为指定的XML
     * @param obj 需要转换的POJO实体
     * @param <T> 需要转换的POJO类
     * @return XML字符串
     * @throws JAXBException XML格式异常
     * @throws IOException  IO异常
     */
    @NonNull
    public static <T > String beanToXml(@NonNull T obj)
            throws JAXBException, IOException {
   
        // 对象 转为XML的接口
        Marshaller marshaller = JAXBContext.newInstance(obj.getClass()).createMarshaller();
        //格式化输出xml
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty(Marshaller.JAXB_ENCODING, "utf-8");
         try(StringWriter writer = new StringWriter()) {
   
             //去掉standalone属性
             writer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "\n    ");
             marshaller.setProperty(Marshaller.JAX
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值