首先说明一下,SOAP XML 和普通XML之间有什么区别
与SOAP XML 相比 XML 是没有什么固定的格式
而SOAP XML 则有固定的标签组成头部,响应信息,错误信息等
具体可参考 SOAP 语法
现在来说说怎么生成SOAP XML
这是咱们要定义的格式内容,另外还有其它格式的xml在源码中
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://www.w3.org/">
<soapenv:Header/>
<soapenv:Body>
<web:SubmitContent>
<pUsername>pUsername</pUsername>
<pPassword>pPassword</pPassword>
<pMyOrigin>pMyOrigin</pMyOrigin>
<pVersion>1.0</pVersion>
<pContent>
<![CDATA[<AVS_TRANSACTIONS><VERSION>1.0</VERSION><DATE_CREATED>20120806</DATE_CREATED><RECORDS><RECORD num="1"><USER_NAME>哆啦A梦丶幻想</USER_NAME><USER_AGE>18</USER_AGE><USER_SEX>MAN</USER_SEX><PHONE_NUMBER>1111111111111</PHONE_NUMBER></RECORD></RECORDS></AVS_TRANSACTIONS>]]>
</pContent>
</web:SubmitContent>
</soapenv:Body>
</soapenv:Envelope>
首先是定义,SOAP头部
// 我们主要需要定义的内容是<soapenv:Body></soapenv:Body>标签下的内容
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage soapMessage = messageFactory.createMessage();
SOAPPart soapPart = soapMessage.getSOAPPart();
// SOAP Envelope
SOAPEnvelope envelope = soapPart.getEnvelope();
// SOAP Header
SOAPHeader header = soapMessage.getSOAPHeader();
// SOAP Body
SOAPBody body = soapMessage.getSOAPBody();
// 移除xmlns:SOAP-ENV
envelope.removeNamespaceDeclaration(envelope.getPrefix());
// 设置前缀,默认为SOAP-ENV
envelope.setPrefix(prefix);
header.setPrefix(prefix);
body.setPrefix(prefix);
envelope.addNamespaceDeclaration(prefix, "http://www.w3.org/2001/12/soap-envelope");
envelope.addNamespaceDeclaration(myNamespace, "http://www.w3.org/");
定义body
// SOAP Body
SOAPElement soapBodyElem = soapBody.addChildElement("SubmitContent", myNamespace);
SOAPFactory soapFactory = SOAPFactory.newInstance();
List<SOAPElement> baseSoapElementList = SoapUtils.baseSoapElement(soapFactory);
for (SOAPElement soapElement : baseSoapElementList) {
soapBodyElem.addChildElement(soapElement);
}
List<Record> recordList = new ArrayList<>();
Record record = Record.builder()
.num("1")
.userName("哆啦A梦丶幻想")
.age(18)
.sex(SexEnums.MAN)
.phone("1111111111111")
.build();
recordList.add(record);
Transaction transaction = Transaction.of("1.0", "20120806", recordList);
String test = XmlUtils.objToXml(transaction);
SOAPElement names = soapFactory.createElement("pContent");
Document soapBodyDoc = names.getOwnerDocument();
CDATASection cdata = soapBodyDoc.createCDATASection(test);
names.appendChild(cdata);
soapBodyElem.addChildElement(names);
// 更新soap
soapMessage.saveChanges();
解析SOAP XML
这里解析SOAP XML实际上就是将SOAP Body中的节点取出,然后在正常解析(就像解析普通的xml格式)
Document document = DocumentHelper.parseText(xml);
// 获取SOAP XML Body的下一个节点
String beanXml = document.getRootElement().element("Body").element(
elementName).asXML();
// XML 正常解析
JAXBContext jaxbContext = JAXBContext.newInstance(classes);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
return (T) unmarshaller.unmarshal(new StringReader(beanXml));
源码地址:
参考博客:
将soap报文(或xml)转换成对象
JAXB(二)——核心注解介绍
如有建议,欢迎指出。