Закрывающий тег отсутствует в java soap xml

Я пытаюсь создать ответ на мыло xml в Java. Каждая часть сообщения в порядке, кроме отсутствующего закрывающего тега. </ns1:рецепторExpressResponse>

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

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

    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:рецепторExpressResponse».

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

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

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);
    }
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
607
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

Спасибо за ответ, Юань, в этой строке: soapBody.addDocument(document); Я добавляю документ, который включает в себя несколько элементов. Чего не должно быть достаточно?

Juan Chipoco 28.05.2019 17:32

Вы совершенно правы, Юань, я внесу изменения и опубликую здесь окончательную версию. Большое спасибо!

Juan Chipoco 28.05.2019 17:55

Другие вопросы по теме