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>
结果:转化完美