gpt4 book ai didi

java - Java Soap XML 中缺少结束标记

转载 作者:行者123 更新时间:2023-11-30 05:37:16 26 4
gpt4 key购买 nike

我正在尝试用 Java 构建 xml SOAP 响应。除了缺少结束标记之外,消息的每个部分都正常

我在谷歌和一些书籍上进行了搜索,它们都以与我相同的方式构建了该消息。然而在我的留言里 标签未出现

在我的代码下面:

    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);
}

最佳答案

您的输出是正确的。

<ns1:receptorExpressResponse xmlns:ns1="http://tempuri.org/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

你看到最后一个/了吗?这意味着这个 xml 元素已经完成。

所以你的问题是让你的其他元素作为这个元素的子元素(receptorExpressResponse)

关于java - Java Soap XML 中缺少结束标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56343979/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com