如何从标记中删除命名空间但保留其前缀?

4 java xml soap web-services java-ee

我能够生成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");
    
    Run Code Online (Sandbox Code Playgroud)

我的SOAP消息

   ...
     <v9:SoapMessage xmlns:els="URL TO SERVER">
         ...
Run Code Online (Sandbox Code Playgroud)

我所期待的

   ...
      <v9:SoapMessage>
           ...
Run Code Online (Sandbox Code Playgroud)

更新:

如果我使用以下内容,则会遇到以下错误

    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.
Run Code Online (Sandbox Code Playgroud)

sab*_*ver 5

要为所有标记添加名称空间前缀,您必须在每个插入的子项上重新声明所需的前缀(最终是名称空间),否则它将从父元素继承(隐含地)名称空间.

试试例如:

SOAPBodyElement getList = body.addBodyElement(bodyName, "v9", "http://URL TO SERVER");
Run Code Online (Sandbox Code Playgroud)

要么

soapBody.addChildElement("SomeElement", "v9", "http://URL TO SERVER");
Run Code Online (Sandbox Code Playgroud)

要么

soapBody.addChildElement("v9:SomeElement");
Run Code Online (Sandbox Code Playgroud)

有时你可能不得不使用一个QName对象而不仅仅是一个String或一个Name.

它几乎取决于您使用的SOAP-API/Implementation,但原则在任何地方都是相同的:重新声明(显式)或继承(隐式).