我在客户端创建了一个SOAPHandler,用于将传出请求记录到服务器&使用JAX-WS修改一些元素。
修改元素后,我保存了消息:
try {
// modifying elements
SOAPBody body = soapMsg.getSOAPBody();
NodeList blst = body.getElementsByTagName("ns6:exportNsiItemRequest");
Node itm = blst.item(0);
Node itm2 = itm.getFirstChild();
Document doc = body.getOwnerDocument();
doc.adoptNode(nd);
itm.insertBefore(nd, itm2);
soapMsg.saveChanges();
log.info("XML saved!");
} catch (SOAPException e1) {
log.info("XML DOESN'T saved!");
e1.printStackTrace();
}
然后我打印消息:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
msg.writeTo(baos);
System.out.println(baos.toString(getMessageEncoding(msg)));
这是打印消息的一部分:
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="xmldsig-4cf24b6d-5c1a-4756-9657-3ba87c3af164">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
我使用Wireshark查看发送到服务器的实际soap消息的上下文。
我看到了什么?它是:
<ds:Signature
xmlns=""
Id="xmldsig-4cf24b6d-5c1a-4756-9657-3ba87c3af164"
xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
为什么有些东西修改了我的信息并插入空的xlnms =“”标签???
答案 0 :(得分:3)
插入的代码与XML Namespaces相关。它们是由万维网联盟在1999年定义的(您可以查看文档here,以及最近的version)。正如那些文件中提到的那样:
XML命名空间提供了一种简单的方法,用于通过将它们与URI引用标识的命名空间相关联来限定可扩展标记语言文档中使用的元素和属性名称。
做了一些研究,我发现了this引用,讨论了xmlns
标记,从其内容中提取:
前缀
xmlns:
被指定为用于声明命名空间的语法设备,但它本身并不与Jan 1999命名空间规范中的任何命名空间名称相关联......请注意,在声明命名空间时必须使用保留前缀
xmlns:
...属性名称
xmlns
,用于声明默认命名空间,因此也与此命名空间名称相关联...
正如我在评论中提到的,我相信你可以分享更多的代码,这可能会更清楚地说明为什么会发生这种情况,但正如我们从参考文献中看到的那样,空xmlns
标签是可能作为必需的默认值添加(即,文档上的URI没有默认的名称空间前缀)。
为了进一步解释,让我们看看你在文档中声明的其他命名空间(正确使用xmlns:
前缀作为参考状态的地方):
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
此处,名称空间前缀(如别名)为 ds
,名称空间URI 为 {{ 1}} 即可。这意味着在您的文档中,http://www.w3.org/2000/09/xmldsig#
之类的元素将等同于在解析文档时使用标识符<ds:foo />
。
如果您想了解更多信息,可以查看this一个很好的问题和答案,以解释有关名称空间的更多信息,并提供一些有用的外部参考资料。