Java SoapMessage 添加空命名空间

Java SoapMessage add empty namespace

我正在调用第三方 soap,其中每个元素都必须有一个命名空间。我正在从 Java 调用 .NET 服务。在某些元素中,我必须包含“http://abc.com”。其他时候,我必须包括 xmlns:""。例如;

<GetYears xmlns="http://example.com">
  <oCar xmlns="">
    <make xmlns="http://example.com">Ford</make>
    <model xmlns="http://example.com">F250</make>
  </oCar>
</GetYears>

我正在使用 javax.xml.soap。*

        MessageFactory messageFactory = MessageFactory.newInstance();
        SOAPMessage soapMessage = messageFactory.createMessage();
        ...
        QName bodyName = new QName("http://example.com", "GetAircraftDueListItems");
        SOAPElement soapBodyElement = soapBody.addBodyElement(bodyName);
        QName qName = new QName("", "oCar");
        SOAPElement carEement = soapBodyElement.addChildElement(qName);

默认情况下,这会产生以下输出,该输出被服务拒绝,因为 oCar 上缺少命名空间“”。

<GetYears xmlns="http://example.com">
  <oCar>
    <make xmlns="http://example.com">Ford</make>
    <model xmlns="http://example.com">F250</make>
  </oCar>
</GetYears>

似乎忽略了空命名空间。有没有办法强制元素包含 xmlns=""?

谢谢

不幸的是,似乎无法以某种方式强制显示空 namespace。另请参阅 toString() 函数的 java docs for QName

The commonly accepted way of representing a QName as a String was defined by James Clark. Although this is not a standard specification, it is in common use, e.g. Transformer.setParameter(String name, Object value). This implementation represents a QName as: "{" + Namespace URI + "}" + local part. If the Namespace URI .equals(XMLConstants.NULL_NS_URI), only the local part is returned. An appropriate use of this method is for debugging or logging for human consumption.

另一方面,

NULL_NS_URIjava docs for XMLConstants 中定义为:

Namespace URI to use to represent that there is no Namespace. Defined by the Namespace specification to be "".

所以这是设计使然。也许您可以以某种方式配置第三方 soap 以接受空 namespaces?否则也许检查空 namesspaces 并使用虚拟或默认值 namespace 可以解决问题。