相关博客:《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;