Java SoapMessage 添加空命名空间

Posted

技术标签:

【中文标题】Java SoapMessage 添加空命名空间【英文标题】:Java SoapMessage add empty namespace 【发布时间】:2022-01-08 11:43:36 【问题描述】:

我正在调用第三方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=""?

谢谢

【问题讨论】:

【参考方案1】:

不幸的是,似乎不可能以某种方式强制显示一个空的namespace。对于toString() 函数,另请参见java docs for QName:

将 QName 表示为字符串的普遍接受的方式是 由詹姆斯克拉克定义。虽然这不是标准规范, 它是常用的,例如Transformer.setParameter(字符串名称,对象 价值)。此实现将 QName 表示为:“”+ 命名空间 URI + "" + 本地部分。 如果命名空间 URI .equals(XMLConstants.NULL_NS_URI),则仅返回本地部分。一个 适当使用此方法用于调试或记录人类 消费。

另一方面,NULL_NS_URI 在java docs for XMLConstants 中定义为:

用于表示没有命名空间的命名空间 URI。 由命名空间规范定义为“”。

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

【讨论】:

以上是关于Java SoapMessage 添加空命名空间的主要内容,如果未能解决你的问题,请参考以下文章

使用命名空间和前缀的 JAXB 解组

添加空的默认 XML 命名空间 xmlns="" 属性?

PHP SimpleXML->addChild - 不需要的空命名空间属性

JAVA 不同类载入器命名空间的理解

从 Java 中的 SOAPMessage 获取原始 XML

添加带有前缀的开始元素,没有命名空间