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;
相关推荐
韩立学长4 分钟前
【开题答辩实录分享】以《在线预问诊系统设计与实现》为例进行选题答辩实录分享
vue.js·spring boot·mysql
猿小羽40 分钟前
Spring AI + MCP 实战:构建标准化 AI 智能代理与上下文集成
java·spring boot·llm·ai agent·spring ai·anthropic·mcp
高山上有一只小老虎41 分钟前
mybatisplus分页查询版本 3.5.8 以下和版本 3.5.9及以上的区别
java·spring boot·mybatis
哪里不会点哪里.43 分钟前
Spring Boot 项目搭建过程
java·spring boot·后端
前端玖耀里43 分钟前
Spring Boot 3 集成 Apache Calcite:多数据源查询的终极解决方案
spring boot·后端·apache
Stecurry_3044 分钟前
Spring Boot 深度进阶:从配置管理到生产级实践
java·spring boot·后端
没有bug.的程序员1 小时前
Spring Cloud Gateway:API网关限流与熔断实战
java·开发语言·数据库·spring boot·gateway·api·springcloud
QQ588501981 小时前
springboot地区特色农产品团购商城平台 小程序
spring boot·后端·小程序