Отсутствует закрывающий тег в XML-коде Java - PullRequest
1 голос
/ 28 мая 2019

Я пытаюсь создать XML-ответ мыла в Java. Все части сообщения в порядке, за исключением отсутствующего закрывающего тега </ Ns1: receptorExpressResponse>

Я искал в Google и в некоторых книгах, и все они создали сообщение так же, как и я. Однако в моем сообщении Тег </ ns1 :ceptorExpressResponse> не отображается

Ниже моего кода:

    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: receorExpressResponse.

Пожалуйста, кто-нибудь может помочь, я буду очень благодарен

Спасибо Юаню, финальная версия:

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

1 Ответ

1 голос
/ 28 мая 2019

Ваш вывод правильный.

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

Вы видите последние /?это означает, что этот элемент xml завершен.

Таким образом, ваша проблема состоит в том, чтобы сделать ваши другие элементы дочерними по отношению к этому элементу (receorExpressResponse)

...