我正在实现一个自制的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专家,如果我犯了一些愚蠢的错误,请不要骂我;)
答案 0 :(得分:10)
请求的功能是issue 103中JAXB问题跟踪器的增强功能。由于JAXB作者发现在实际序列化开始确定实际需要哪些命名空间之前再次遍历对象树,因此增强功能被拒绝了。
虽然相当臃肿,但不必要的命名空间不会使XML文档无效。如果你真的必须保存几个字节并且额外的计算成本是可以承受的,那么编写你自己的XML处理器/过滤器应该很容易,它接受JAXB输出,解析文档并编写一个没有未使用的命名空间定义的新文档。