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 添加空命名空间的主要内容,如果未能解决你的问题,请参考以下文章
PHP SimpleXML->addChild - 不需要的空命名空间属性