欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > JAVA-响应报文转XML

JAVA-响应报文转XML

2025/9/27 1:20:15 来源:https://blog.csdn.net/MrBInsomnia/article/details/144205276  浏览:    关键词: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("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;").replace("\"", "&quot;").replace("'", "&apos;");}

这种方式比较简单直接,就是将response的内容通过entrySet循环key作为xml的标签,value作为标签中的值,使用append直接输出

另一种是通过XML实现类直接进行转换:(这种对于复杂一点的项目效果比较好)

    /*** 构建XML响应* 方式二:Document构建xml后,Transformer转写** @return* @throws Exception*/public String buildXmlResponse(Map xmlMap) {try {// 创建 DocumentBuilderDocumentBuilderFactory 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格式的方法

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词