我能够生成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.
答案 0 :(得分:5)
要为所有标记添加名称空间前缀,必须在每个插入的子项上重新声明所需的前缀(最终是名称空间),否则它将从父元素继承(隐含地)名称空间
尝试例如:
SOAPBodyElement getList = body.addBodyElement(bodyName, "v9", "http://URL TO SERVER");
或
soapBody.addChildElement("SomeElement", "v9", "http://URL TO SERVER");
或
soapBody.addChildElement("v9:SomeElement");
有时您可能需要使用QName
对象,而不仅仅是String
或Name
。
它几乎取决于您使用的SOAP-API / Implementation,但原则在任何地方都是相同的:重新声明(显式)或继承(隐式)。
答案 1 :(得分:-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");
有关详细信息,请访问此REFERENCE LINK