SpringBoot使用Jackson-XML裁剪多余的根节点

相关博客:《SpringBoot集成WebService(wsdl)》

比如我们有以下入参

我们只需要MedicalCardInfo这个根节点,其余都不要。如何处理?

xml 复制代码
<A>
    <B>
        <Sender>Aa</Sender>
        <MsgType>Bb</MsgType>
        <MsgVersion>Cc</MsgVersion>
    </B>
    <MsgBody>
        <MedicalCardInfo>
            <AuthorOrganization>1</AuthorOrganization>
            <IdCard>1234567</IdCard>
        </MedicalCardInfo>
    </MsgBody>
</A>

解决办法

java 复制代码
	private String getTargetXmlString(String sourceXmlString, String xmlRootElement) throws ParserConfigurationException, TransformerException, IOException, SAXException {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse(new InputSource(new StringReader(sourceXmlString)));

        NodeList msgBodyList = document.getElementsByTagName(xmlRootElement);
        if (msgBodyList.getLength() == 0) {
            return null;
        }
        Node msgBodyNode = msgBodyList.item(0);
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        StringWriter writer = new StringWriter();
        transformer.transform(new DOMSource(msgBodyNode), new StreamResult(writer));
        return writer.getBuffer().toString();
    }

    @Test
    public void test() throws ParserConfigurationException, IOException, TransformerException, SAXException {
        String params = "<A>\n" +
                "    <B>\n" +
                "        <Sender>Aa</Sender>\n" +
                "        <MsgType>Bb</MsgType>\n" +
                "        <MsgVersion>Cc</MsgVersion>\n" +
                "    </B>\n" +
                "    <MsgBody>\n" +
                "        <MedicalCardInfo>\n" +
                "            <AuthorOrganization>1</AuthorOrganization>\n" +
                "            <IdCard>1234567</IdCard>\n" +
                "        </MedicalCardInfo>\n" +
                "    </MsgBody>\n" +
                "</A>";
        params = getTargetXmlString(params, "MedicalCardInfo");
        System.out.println(params);
    }

输出

xml 复制代码
<MedicalCardInfo>
    <AuthorOrganization>1</AuthorOrganization>
    <IdCard>1234567</IdCard>
</MedicalCardInfo>

配合Jackson-XML使用

伪代码

java 复制代码
		//获取统一入口接口
		IWebService<T> webService = (IWebService<T>) ApplicationContextUtils.getBean(service);
		//获取统一入口接口请求泛型参数的具体 DTO
        Class<T> parameterType = (Class<T>) WebServiceTypeCache.getParameterType(service);
        //获取具体 DTO @JacksonXmlRootElement注解 localName 的 value(即需要的根节点)
        JacksonXmlRootElement annotation = parameterType.getAnnotation(JacksonXmlRootElement.class);
        String xmlRootElement = annotation.localName();
        //截取并替换根节点为需要的根节点
        params = getTargetXmlString(params, xmlRootElement);
        //转为具体的请求DTO
        T req = JacksonUtils.xmlMapper.readValue(params, parameterType);
        //调用具体的实现类的方法,并传入具体的请求 DTO
        R r;
        try {
            r = R.ok(webService.handle(req));
        } catch (Exception e) {
            log.error("{}异常:", service, e);
            r = R.error(e.getMessage());
        }
        String rString = JacksonUtils.xmlMapper.writeValueAsString(r);
        log.info("{}出参:{}", service, rString);
        return rString;
相关推荐
helx821 小时前
SpringBoot实战(三十二)集成 ofdrw,实现 PDF 和 OFD 的转换、SM2 签署OFD
spring boot·后端·pdf
rOuN STAT1 小时前
Skywalking介绍,Skywalking 9.4 安装,SpringBoot集成Skywalking
spring boot·后端·skywalking
赵丙双3 小时前
spring boot 排除自动配置类的方式和原理
java·spring boot·自动配置
bilI LESS3 小时前
Spring Boot接收参数的19种方式
java·spring boot·后端
Chan163 小时前
MCP 开发实战:Git 信息查询 MCP 服务开发
java·开发语言·spring boot·git·spring·java-ee·intellij-idea
花千树-0106 小时前
Java 实现 ReAct Agent:工具调用与推理循环
java·spring boot·ai·chatgpt·langchain·aigc·ai编程
小信丶6 小时前
Spring MVC @SessionAttributes 注解详解:用法、场景与实战示例
java·spring boot·后端·spring·mvc
-南帝-7 小时前
RocketMQ2.3.5+SpringBoot 3.2.11+ java17安装-集成-测试案例
java·spring boot·rocketmq
wqww_17 小时前
springboot 使用websocket来记录移动人物坐标
spring boot·后端·websocket
小江的记录本8 小时前
【Docker】Docker系统性知识体系与命令大全(镜像、容器、数据卷、网络、仓库)
java·网络·spring boot·spring·docker·容器·eureka