【问题标题】:Java SoapMessage add empty namespaceJava SoapMessage 添加空命名空间
【发布时间】: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=""?

谢谢

【问题讨论】:

    标签: java xml soap namespaces element


    【解决方案1】:

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

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

    另一方面,NULL_NS_URIjava docs for XMLConstants 中定义为:

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-22
      • 1970-01-01
      • 2017-06-11
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 2017-07-04
      相关资源
      最近更新 更多