Java SoapMessage 添加空命名空间

Java SoapMessage add empty namespace

提问人:Edward Gilmore 提问时间:12/2/2021 更新时间:12/7/2021 访问量:320

问:

我正在调用第三方 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 命名空间 元素

评论


答:

0赞 spcial 12/7/2021 #1

不幸的是,似乎不可能以某种方式强制显示一个空的.另请参阅 QName 的 java 文档,了解该函数:namespacetoString()

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

NULL_NS_URI另一方面,在 XMLConstants 的 java 文档中定义为:

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

所以这是设计使然。也许您可以以某种方式将第三方肥皂配置为接受空的?否则,也许检查空并使用虚拟或默认值就可以解决问题。namespacesnamesspacesnamespace