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

jb.*_*jb. 11 java xml jaxb xml-namespaces jaxb2

我正在实现一个自制的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>
Run Code Online (Sandbox Code Playgroud)

代替:

   <ns:auth xmlns:ns="urn:ietf:params:xml:ns:ilf-auth>compton@ilf</ns:auth>
Run Code Online (Sandbox Code Playgroud)

有什么办法可以转变吗?

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

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

jar*_*bjo 10

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

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

  • [XSLT执行此转换](http://stackoverflow.com/a/4594626/2019259),如果您碰巧使用CXF:http://cxf.apache.org/docs/xslt-feature.html (2认同)