自学内容网 自学内容网

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 {
            // 创建 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)!