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对象而不仅仅是 aString或 a Name

这在很大程度上取决于您使用的 SOAP-API/实现,但原则在任何地方都是相同的:重新声明(显式)或继承(隐式)。

于 2013-11-07T09:18:46.143 回答
-1

在您预期的 SOAP 消息中,前缀的情况有所不同,似乎您正在编写客户端,请求在 .net 中开发的服务提供商,这就是您可能需要更改前缀的原因。

我认为您可以从以下代码中获取概念:

       MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL); 
    SOAPMessage soapMessage = messageFactory.createMessage(); 

    SOAPPart soapPart = soapMessage.getSOAPPart(); 

    SOAPEnvelope soapEnvelope = soapPart.getEnvelope(); 

    SOAPBody soapBody = soapEnvelope.getBody(); 

    soapEnvelope.removeNamespaceDeclaration(soapEnvelope.getPrefix()); 
    soapEnvelope.addNamespaceDeclaration("soap", "http://schemas.xmlsoap.org/soap/envelope/"); 

    soapEnvelope.setPrefix("soap"); 
    soapBody.setPrefix("soap"); 

    soapEnvelope.addNamespaceDeclaration("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
    soapEnvelope.addNamespaceDeclaration("xsd", "http://www.w3.org/2001/XMLSchema");   soapMessage.getSOAPHeader().detachNode(); 

    soapMessage.getMimeHeaders().setHeader("SOAPAction", "http://www.example.com/TransactionProcess"); 

有关更多详细信息,请访问此参考链接

于 2013-11-04T08:41:44.717 回答