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;
相关推荐
ladymorgana6 小时前
【spring boot】三种日志系统对比:ELK、Loki+Grafana、Docker API
spring boot·elk·grafana
程序员秘密基地7 小时前
基于html,css,vue,vscode,idea,,java,springboot,mysql数据库,在线旅游,景点管理系统
java·spring boot·mysql·spring·web3
wen's8 小时前
React Native安卓刘海屏适配终极方案:仅需修改 AndroidManifest.xml!
android·xml·react native
xdscode9 小时前
SpringBoot ThreadLocal 全局动态变量设置
java·spring boot·threadlocal
天河归来11 小时前
springboot框架redis开启管道批量写入数据
java·spring boot·redis
合作小小程序员小小店11 小时前
web网页,在线%食谱推荐系统%分析系统demo,基于vscode,uniapp,vue,java,jdk,springboot,mysql数据库
vue.js·spring boot·vscode·spring·uni-app
sniper_fandc12 小时前
SpringBoot系列—MyBatis(xml使用)
java·spring boot·mybatis
咖啡啡不加糖13 小时前
RabbitMQ 消息队列:从入门到Spring Boot实战
java·spring boot·rabbitmq
代码老y15 小时前
Spring Boot项目中大文件上传的高级实践与性能优化
spring boot·后端·性能优化
Xiao_zuo_ya16 小时前
SpringBoot-Freemarker导出word
spring boot·word