JAVA-响应报文转XML
在我们的开发过程中,接口响应一般都是使用的JSON格式;随着我们接入的系统的增加,以及开发需求的增加,不乏出现一些使用XML解析的系统,需要我们将response内容转换成XML的格式响应,那么我们需要对此重新写个接口吗?
当然不!我们可以通过增加yml配置的形式,或者通过在接口上增加Type的方式进行XML格式的转换,那么接下来我们要讨论的便是如何转换XML?
我这边能提供的有俩种方式,一种是比较简单直接的字符串拼接的方式:
/**
* 构建XML响应
* 方式一:简单粗暴,直接使用字符串拼接
*
* @param value
* @param request
* @return
*/
public String buildResponseXML(Object value, Map response) {
StringBuilder xmlBuilder = new StringBuilder();
try {
String str = "?xml version=\"1.0\" encoding=\"UTF-8\"?";
xmlBuilder.append("<").append(str).append(">").append("\n");
buildXmlFromMap(response, xmlBuilder);
} catch (Exception e) {
}
return xmlBuilder.toString().trim();
}
/**
* 构建xml方法,将map集合构建成XML格式;
*
* @param map
* @param xmlBuilder
*/
private static void buildXmlFromMap(Map<String, Object> map, StringBuilder xmlBuilder) {
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
if (value instanceof Map) {
// 如果值是一个 Map,递归处理
xmlBuilder.append("<").append(key).append(">");
buildXmlFromMap((Map<String, Object>) value, xmlBuilder);
xmlBuilder.append("</").append(key).append(">");
} else {
// 普通键值对
xmlBuilder.append("<").append(key).append(">")
.append(value == null ? "" : escapeXml(value.toString()))
.append("</").append(key).append(">");
}
}
}
/**
* 将XML中的特殊字符转义
*
* @param value
* @return
*/
private static String escapeXml(String value) {
return value.replace("&", "&")
.replace("<", "<")
.replace(">", ">")
.replace("\"", """)
.replace("'", "'");
}
这种方式比较简单直接,就是将response的内容通过entrySet循环key作为xml的标签,value作为标签中的值,使用append直接输出
另一种是通过XML实现类直接进行转换:(这种对于复杂一点的项目效果比较好)
/**
* 构建XML响应
* 方式二:Document构建xml后,Transformer转写
*
* @return
* @throws Exception
*/
public String buildXmlResponse(Map xmlMap) {
try {
// 创建 DocumentBuilder
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
// 创建 Document 对象(代表整个 XML 文档)
Document document = builder.newDocument();
// 生成XML节点
addNodesFromMap(document, null, xmlMap);
// 转换 Document 为字符串
return convertDocumentToString(document);
} catch (Exception e) {
throw ExceptionUtils.create(ErrorCodeEnum.SCIM_RESPONSE_IS_FAILED);
}
}
/**
* 公共方法:从 Map 生成 XML 节点
*
* @param document Document 对象
* @param parent 父节点或根节点
* @param map Map 数据
*/
private void addNodesFromMap(Document document, Element parent, Map<String, Object> map) {
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
// 创建当前节点
Element child = document.createElement(key);
// 处理value值
if (value instanceof Map) {
// 如果值是 Map,递归创建子节点
addNodesFromMap(document, child, (Map<String, Object>) value);
} else if (value instanceof List) {
child = document.createElement(key);
// 如果值是 List,处理列表内容
handleList(document, child, key, (List<Object>) value);
} else if (value instanceof HashSet) {
List list = new ArrayList((HashSet) value);
child = document.createElement(key);
// 如果值是 List,处理列表内容
handleList(document, child, key, (List<Object>) list);
} else {
// 如果值是普通对象,直接设置文本内容
child.appendChild(document.createTextNode(value != null ? value.toString() : null));
}
// 判断是否存在父节点,如果没有父节点,说明是根节点
if (parent == null) {
document.appendChild(child);
} else {
// 将子节点附加到父节点
parent.appendChild(child);
}
}
}
/**
* 处理 List 类型的值
*
* @param document Document 对象
* @param parent 父节点
* @param key 当前标签名
* @param list List 数据
*/
private void handleList(Document document, Element parent, String key, List<Object> list) {
// logger.info("当前List转换标签Key ====>>> " + key);
if (CollectionUtils.isEmptyCollection(list)) {
return;
}
// 遍历list值
for (Object item : list) {
if (item instanceof String || item instanceof Number || item instanceof Boolean) {
// 如果是简单类型,直接创建子节点
Element child = document.createElement(key); // 子节点名称与 List 的 key 保持一致
child.appendChild(document.createTextNode(item.toString()));
parent.appendChild(child);
} else if (item instanceof Map) {
// 如果是 Map,递归处理
Element child = document.createElement(key); // 子节点名称与 List 的 key 保持一致
addNodesFromMap(document, child, (Map<String, Object>) item);
parent.appendChild(child);
}
}
}
/**
* 将 Document 对象转换为 XML 格式写出
*
* @param document
* @return
* @throws Exception
*/
private static String convertDocumentToString(Document document) throws Exception {
// 使用 Transformer 将 Document 转换为字符串
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
DOMSource domSource = new DOMSource(document);
StringWriter writer = new StringWriter();
StreamResult result = new StreamResult(writer);
transformer.transform(domSource, result);
return writer.toString();
}
以上就是response的JSON转为XML格式的方法
原文地址:https://blog.csdn.net/MrBInsomnia/article/details/144205276
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!