我正在尝试用Java构建xml soap响应。 消息的每个部分都可以,但缺少结束标记
我在google上搜索了一些书籍,所有书籍都以与我相同的方式来构建消息。但是在我的留言中 标签没有出现
在我的代码下面:
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document mensajeNoFirmado3A = documentBuilder.newDocument();
Element DestinatarioACHElement = mensajeNoFirmado3A.createElement("Destinatario_ACH");
Element numOrdenOrgiginateElement = mensajeNoFirmado3A.createElement("num_orden_originante");
numOrdenOrgiginateElement.setTextContent(mensaje2A.getNum_orden_originante());
DestinatarioACHElement.appendChild(numOrdenOrgiginateElement);
Element numOrdenAchElement = mensajeNoFirmado3A.createElement("num_orden_ach");
numOrdenAchElement.setTextContent(mensaje2A.getNum_orden_ach());
DestinatarioACHElement.appendChild(numOrdenAchElement);
Element tipoOrdenElement = mensajeNoFirmado3A.createElement("tip_orden");
tipoOrdenElement.setTextContent("250");
DestinatarioACHElement.appendChild(tipoOrdenElement);
Element codSucursalDestinatarioElement = mensajeNoFirmado3A.createElement("cod_sucursal_destinatario");
codSucursalDestinatarioElement.setTextContent(mensaje2A.getCod_sucursal_destinatario());
DestinatarioACHElement.appendChild(codSucursalDestinatarioElement);
Element codPaisDestinatarioElement = mensajeNoFirmado3A.createElement("cod_pais_destinatario");
codPaisDestinatarioElement.setTextContent(mensaje2A.getCod_pais_destinatario());
DestinatarioACHElement.appendChild(codPaisDestinatarioElement);
Element codRespuestaElement = mensajeNoFirmado3A.createElement("cod_respuesta");
...........................................
codRespuestaElement.setTextContent(codRespuesta);
DestinatarioACHElement.appendChild(codRespuestaElement);
Element numOrdenDestElement = mensajeNoFirmado3A.createElement("num_orden_destinatario");
............................................
DestinatarioACHElement.appendChild(numOrdenDestElement);
Element titularDestinatarioElement = mensajeNoFirmado3A.createElement("titular_destinatario");
if(isClienteBanco.get()){
if ("CONFIRMACION DE APLICACION".equals(respuestaAbono.getEstado())) {
titularDestinatarioElement.setTextContent(nombreCliente);
} else{
titularDestinatarioElement.setTextContent("XXX");
}
}
else {
titularDestinatarioElement.setTextContent("XXX");
}
DestinatarioACHElement.appendChild(titularDestinatarioElement);
....................
mensajeNoFirmado3A.appendChild(DestinatarioACHElement);
KeysFromPKCS12 keysFromPKCS12 = new KeysFromPKCS12(connections,parameterService);
IKeys.KeyAndCert keyAndCert = keysFromPKCS12.getKeyAndCert();
PrivateKey key = keyAndCert.getKey();
document = documentBuilderFactory.newDocumentBuilder().newDocument();
String keyname = parameterService.valueOf(XXXXXXXXXXXXXXXXXXXXX, XXXXXXXXXXXXX);
//Node importedNode = document.importNode(mensajeNoFirmado3A.getDocumentElement(), true);
//document.appendChild(importedNode);
LOGGER.info("Firmamos el mensaje 3A...");
XMLSigner.sign(document, null, document.importNode(mensajeNoFirmado3A.getDocumentElement(), true), key, keyname);
try
{
MessageFactory mfactory = MessageFactory.newInstance();
SOAPMessage soapMessage = mfactory.createMessage();
SOAPPart soapPart = soapMessage.getSOAPPart();
SOAPEnvelope soapEnvelope = soapMessage.getSOAPPart().getEnvelope();
soapEnvelope.addNamespaceDeclaration("xsd","http://www.w3.org/2001/XMLSchema");
soapEnvelope.addNamespaceDeclaration("xsi","http://www.w3.org/2001/XMLSchema-instance");
SOAPHeader soapHeader = soapEnvelope.getHeader();
soapHeader.detachNode();
SOAPBody soapBody = soapEnvelope.getBody();
////////soapBody = soapMessage.getSOAPBody();
SOAPFactory soapFactory = SOAPFactory.newInstance();
Name bodyName = soapFactory.createName("receptorExpressResponse", "ns1", "http://tempuri.org/");
//Name encName = soapFactory.createName("SOAP-ENV:encodingStyle");
//SOAPBodyElement sbe = soapBody.addBodyElement(bodyName);
//SOAPElement childElement = soapBody.addChildElement("receptorExpressResponse", "ns1");
//sbe.addAttribute(encName, "http://schemas.xmlsoap.org/soap/encoding/");
//
SOAPElement child = soapBody.addBodyElement(bodyName);
child.addNamespaceDeclaration("ns1", "http://tempuri.org/");
child.setEncodingStyle("http://schemas.xmlsoap.org/soap/encoding/");
soapBody.addDocument(document);
soapMessage.saveChanges();
LOGGER.info("Envelope added");
LOGGER.info("SOAPMessage {}", soapMessage);
document = toDocument(soapMessage);
String soapMessageStr = soapMessageToString(soapMessage);
我得到的xml如下:
<SOAP-ENV:Envelope xmlns:SOAP- ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<ns1:receptorExpressResponse xmlns:ns1="http://tempuri.org/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
........................
</ds:Signature>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>"
但是我希望这样:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<ns1:receptorExpressResponse xmlns:ns1="http://tempuri.org/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
..............................
</ds:Signature>
</ns1: receptorExpressResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
您可以看到我的回复中缺少“ / ns1:receptorExpressResponse”。
请有人帮助我会很感激
感谢Yuan的最终版本:
try
{
MessageFactory mfactory = MessageFactory.newInstance();
SOAPMessage soapMessage = mfactory.createMessage();
SOAPPart soapPart = soapMessage.getSOAPPart();
SOAPEnvelope soapEnvelope = soapMessage.getSOAPPart().getEnvelope();
soapEnvelope.addNamespaceDeclaration("xsd","http://www.w3.org/2001/XMLSchema");
soapEnvelope.addNamespaceDeclaration("xsi","http://www.w3.org/2001/XMLSchema-instance");
SOAPHeader soapHeader = soapEnvelope.getHeader();
soapHeader.detachNode();
SOAPBody soapBody = soapEnvelope.getBody();
SOAPFactory soapFactory = SOAPFactory.newInstance();
Name bodyName = soapFactory.createName("receptorExpressResponse", "ns1", "http://tempuri.org/");
SOAPElement child = soapBody.addBodyElement(bodyName);
child.addNamespaceDeclaration("ns1", "http://tempuri.org/");
child.setEncodingStyle("http://schemas.xmlsoap.org/soap/encoding/");
Document childDoc = child.getOwnerDocument();
Node signDocumentNode = childDoc.importNode(document.getFirstChild(), true);
child.appendChild(signDocumentNode);
soapMessage.saveChanges();
LOGGER.info("Envelope added");
LOGGER.info("SOAPMessage {}", soapMessage);
document = toDocument(soapMessage);
String soapMessageStr = soapMessageToString(soapMessage);
LOGGER.info("SOAPMessageStr {}", soapMessageStr);
LOGGER.info("Devolviendo Simple 3A");
salida = nodeToString(document);
LOGGER.info("Salida " + salida);
} catch (SAXException e) {
e.printStackTrace();
LOGGER.info("SAXException {}", e);
} catch(SOAPException ex) {
ex.printStackTrace();
LOGGER.info("SOPAException {}", ex);
} catch (IOException e) {
e.printStackTrace();
LOGGER.info("IOException {}", e);
}
答案 0 :(得分:1)
您的输出正确。
<ns1:receptorExpressResponse xmlns:ns1="http://tempuri.org/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
您看到最后一个/
吗?这表示此xml元素已完成。
因此,您的问题是使其他元素成为该元素的子元素(receptorExpressResponse)