【问题标题】:Closing tag missing in java soap xmljava soap xml中缺少结束标记
【发布时间】:2019-05-28 14:02:40
【问题描述】:

我正在尝试用 Java 构建一个 xml 肥皂响应。 消息的每个部分都可以,除了缺少结束标签

我在 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”。

有人可以帮忙吗,不胜感激

感谢袁,最终版:

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

【问题讨论】:

    标签: java xml soap namespaces


    【解决方案1】:

    你的输出是正确的。

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

    你看到最后一个/ 了吗?这意味着这个 xml 元素是完整的。

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

    【讨论】:

    • 感谢袁老师的回复,在这一行:soapBody.addDocument(document);我要附加一个包含多个元素的文档,这还不够吗?
    • 你说得对,袁,我会修改并在这里发布最终版本。非常感谢!
    猜你喜欢
    • 2018-10-31
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多