webservice接口数据封装java对象转换为xml格式数据,解析工具

1、xml转化工具类代码
java对象转xml格式

import cn.hutool.core.util.NumberUtil;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XppDriver;
import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.Unmarshaller;
import lombok.extern.slf4j.Slf4j;
import java.io.StringReader;
import java.io.Writer;
import java.lang.reflect.Field;
import java.util.Arrays;

@Slf4j
public class XmlUtil {

    /**
     * 将实体变为xml格式 包含别名转换
     *
     * @param t          t
     * @param alias      根节点别名
     * @param omitFields 省略字段
     * @return {@link String }
     */
    public static <T> String parseEntityXml(T t, String alias, String... omitFields) {
        try {

            XStream xStream = new XStream(new XppDriver() {
                public HierarchicalStreamWriter createWriter(Writer out) {
                    return new PrettyPrintWriter(out) {
                    	// 将中间的数据解析为<![CDATA[]]>格式的,清除特殊字符的影响
                        final boolean cdata = true;
                        public void startNode(String name, Class clazz) {
                            super.startNode(name, clazz);
                        }
                        protected void writeText(QuickWriter writer, String text) {
                            if (cdata) {
                                writer.write("<![CDATA[");
                                writer.write(text);
                                writer.write("]]>");
                            } else {
                                writer.write(text);
                            }
                        }
                    };
                }
            });
            if(alias != "" && alias != null){
            	xStream.alias(alias, t.getClass());
            }   
            Field[] declaredFields = t.getClass().getDeclaredFields();
            boolean hasAction = Arrays.stream(declaredFields).anyMatch(item -> item.getName().equals("action"));
            if (hasAction) {
                xStream.useAttributeFor(t.getClass(), "action");
            }
            for (String omitField : omitFields) {
                xStream.omitField(t.getClass(), omitField);
            }

            String xml = xStream.toXML(t);
            xml = xml.replaceAll("__", "_");
            log.info("parseEntityXml解析后的结果为:{}", xml);
            return xml;
        } catch (
                Exception e) {
            log.error("解析{}失败", t.getClass().getName(), e);
            throw new RuntimeException("解析失败:" + e.getMessage());
        }
    }


    /**
     * 解析响应 其中,Result是接收后返回的 实体类,需要自行封装处理   
     * 
     * @param xml xml
     * @return {@link String }
     */
    public static String parseResponseXml(String xml) {
        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(OAResult.class);
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            Result result = (Result) unmarshaller.unmarshal(new StringReader(xml));
            log.info("parseResponseXml解析结果为:{}", result);
            if (result.message() == null) {
                return "";
            }
            if (NumberUtil.parseInt(result.message().value()) <= 0) {
                throw new RuntimeException("操作失败了,原因是:" + result.message().content());
            }
			
            return result.message().content();
        } catch (RuntimeException e) {
            log.error("返回结果小于0,操作数据失败了", e);
            throw e;
        } catch (Exception e) {
            log.error("解析parseResponse失败\uD83D\uDE02", e);
            throw new RuntimeException("解析parseResponse失败:" + e.getMessage());
        }
    }
}

2、测试数据

@Data
@Builder
public class WxBaseMessage {
    /**
     * 成员ID列表(消息接收者,多个接收者用‘|’分隔,最多支持1000个)。
     * 非必传
     * 特殊情况:指定为@all,则向该企业应用的全部成员发送
     * touser、toparty、totag不能同时为空。
     */
    private String touser;
    /**
     * 部门ID列表,多个接收者用‘|’分隔,最多支持100个。
     * 非必传
     * 当touser为@all时忽略本参数
     */
    private String toparty;
    /**
     * 标签ID列表,多个接收者用‘|’分隔,最多支持100个。
     * 非必传
     * 当touser为@all时忽略本参数
     */
    private String totag;
    /**
     * 消息类型
     * 必传
     */
    private String msgtype;
    /**
     * 企业应用的id。可在应用的设置页面查看
     * 必传
     */
    private int agentid;

    /**
     * 文本
     */
    private WxText text;
    /**
     * 表示是否是保密消息,0表示否,1表示是,默认0
     */
    private int safe;
}

@Data
@Builder
public class WxText {
    /**
     * 消息内容,最长不超过2048个字节
     * 必传
     */
    private String content;
}

测试代码

   @Test
    public void testParseXml(){
        WxBaseMessage entity =  WxBaseMessage.builder()
                .touser("xxxx")
                .agentid(1111)
                .totag("ddd")
                .safe(1)
                .build();

        WxText text = WxText.builder()
                .content("""
                        哈哈哈哈哈没想到是测试吧
                        """)
                .build();
        String parsedStr = OAHrmTemplateUtil.parseEntityXml(entity, "org", "touser");
        System.out.println("parsedStr = " + parsedStr);
    }

结果是:
在这里插入图片描述

<org>
  <totag><![CDATA[ddd]]></totag>
  <agentid><![CDATA[1111]]></agentid>
  <text>
    <content><![CDATA[哈哈哈哈哈没想到是测试吧]]></content>
  </text>
  <safe><![CDATA[1]]></safe>
</org>

结果:转化完美

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值