SpringBoot使用Jackson-XML裁剪多余的根节点
相关博客:《SpringBoot集成WebService(wsdl)》
比如我们有以下入参
我们只需要MedicalCardInfo这个根节点,其余都不要。如何处理?
<A><B><Sender>Aa</Sender><MsgType>Bb</MsgType><MsgVersion>Cc</MsgVersion></B><MsgBody><MedicalCardInfo><AuthorOrganization>1</AuthorOrganization><IdCard>1234567</IdCard></MedicalCardInfo></MsgBody>
</A>
解决办法
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();}@Testpublic 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);}
输出
<MedicalCardInfo><AuthorOrganization>1</AuthorOrganization><IdCard>1234567</IdCard>
</MedicalCardInfo>
配合Jackson-XML使用
伪代码
//获取统一入口接口IWebService<T> webService = (IWebService<T>) ApplicationContextUtils.getBean(service);//获取统一入口接口请求泛型参数的具体 DTOClass<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);//转为具体的请求DTOT req = JacksonUtils.xmlMapper.readValue(params, parameterType);//调用具体的实现类的方法,并传入具体的请求 DTOR 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;