问题 JAXB将不需要的名称空间声明附加到标记


我正在实现一个自制的XMPP子协议,我正在使用StAX和JAXB的组合来解析/编组消息。当我编组一条消息时,我最终会遇到大量不需要的命名空间声明:

   <ns2:auth xmlns:ns2="urn:ietf:params:xml:ns:ilf-auth" 
   xmlns:ns4="ilf:iq:experiment:power" xmlns:ns3="ilf:iq:experiment:init" 
   xmlns:ns5="ilf:iq:experiment:values" xmlns:ns6="ilf:iq:experiment:result" 
   xmlns:ns7="ilf:iq:experiment:stop" xmlns:ns8="ilf:iq:experiment:end">
   compton@ilf</ns2:auth>

代替:

   <ns:auth xmlns:ns="urn:ietf:params:xml:ns:ilf-auth>compton@ilf</ns:auth>

有什么办法可以转变吗?

所有这些名称空间都用在由JAXB编组/解组的不同消息中,但每条消息都使用一个名称空间。

PS。我不是XML专家,如果我犯了一些愚蠢的错误,请不要骂我;)


1564
2017-11-04 13:00


起源

对于必须在运输过程中保留以保持其完整性的法律文件而言,这是完全不可接受的。 JAXB是一种使简单事物更复杂的方法
JAXB使xml解析/生成方式更容易。我做了一个同时使用JAXB和dom4j的项目(在两个不同的部分),差异很大。 - jb.


答案:


您正在寻找的功能是作为JAXB问题跟踪器的增强功能而请求的 问题103。由于JAXB作者发现在实际序列化开始确定实际需要哪些命名空间之前再次遍历对象树,因此增强功能被拒绝了。

虽然相当臃肿,但不必要的命名空间不会使XML文档无效。如果你真的必须保存几个字节并且额外的计算成本是可以承受的,那么编写你自己的XML处理器/过滤器应该很容易,它接受JAXB输出,解析文档并写入一个没有未使用的命名空间定义的新文档。


10
2017-11-04 14:26



XSLT执行此转换,如果您碰巧使用CXF: cxf.apache.org/docs/xslt-feature.html - James Daily