4

SOAP メッセージを生成できますが、わかりません

  • soapMessage タグにのみプレフィックスを追加します (名前空間を持たないでください)

     SOAPConnectionFactory soapConnectionFactory =
                    SOAPConnectionFactory.newInstance();
     SOAPConnection connection =
                    soapConnectionFactory.createConnection();
     SOAPFactory soapFactory =
                    SOAPFactory.newInstance();
    
     MessageFactory factory =
                    MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
    
     SOAPMessage message = factory.createMessage();
     SOAPHeader header = message.getSOAPHeader();
     SOAPPart soapPart = message.getSOAPPart();
     SOAPEnvelope soapEnvelope = soapPart.getEnvelope();                
     SOAPBody body = soapEnvelope.getBody();
    
     soapEnvelope.removeNamespaceDeclaration(soapEnvelope.getPrefix());
     soapEnvelope.setPrefix("soap");
     body.setPrefix("soap");
    
     header.removeNamespaceDeclaration(header.getPrefix());
     header.setPrefix("soap");
    
     soapEnvelope.addNamespaceDeclaration("v9", "URL TO SERVER");
    
     Name bodyName;
     bodyName = soapFactory.createName("SearchHotels");
     SOAPBodyElement getList = body.addBodyElement(bodyName);
     getList.setPrefix("v9");
    
     Name childName = soapFactory.createName("SoapMessage", "v9", "URL TO SERVER");
     SOAPElement HotelListRequest = getList.addChildElement(childName);
    
     HotelListRequest.addChildElement("Hotel", "v9").addTextNode("Hilton");
    

私の SOAP メッセージ

   ...
     <v9:SoapMessage xmlns:els="URL TO SERVER">
         ...

私が期待すること

   ...
      <v9:SoapMessage>
           ...

アップデート :

以下を使用すると、次のエラーが発生します

    SOAPElement HotelListRequest = getList.addChildElement("v9:SoapMessage");

    org.w3c.dom.DOMException: NAMESPACE_ERR: An attempt is made to create or change an object in a 
                                             way which is incorrect with regard to namespaces.
4

2 に答える 2

5

名前空間プレフィックスをすべてのタグに追加するには、挿入されたすべての子で目的のプレフィックス (および最終的には名前空間) を再宣言する必要があります。そうしないと、親要素から名前空間が (暗黙的に) 継承されます。

たとえば、試してみてください:

SOAPBodyElement getList = body.addBodyElement(bodyName, "v9", "http://URL TO SERVER");

また

soapBody.addChildElement("SomeElement", "v9", "http://URL TO SERVER");

また

soapBody.addChildElement("v9:SomeElement");

またはQNameだけでなく、オブジェクトを使用する必要がある場合もあります。StringName

使用する SOAP-API/実装に大きく依存しますが、原則はどこでも同じで、再宣言 (明示的) または継承 (暗黙的) のいずれかです。

于 2013-11-07T09:18:46.143 に答える