我正在实现XMPP的自制子协议(protocol),并且我正在使用StAX和JAXB的组合来解析/编码消息。当我编码一条消息时,我最终会加载无用的 namespace 声明:
<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>
有什么办法可以解决这个问题吗?
所有这些 namespace 都用在JAXB编码/解码的不同消息中,但是每条消息都使用一个命名空间。
PS。我不是XML专家,如果我犯了一些愚蠢的错误,请不要指责我;)
最佳答案
在issue 103中,对JAXB问题跟踪器的增强要求您提供所需的功能。增强功能被拒绝了,因为JAXB作者发现在实际序列化开始确定实际需要哪个 namespace 之前,再次遍历对象树太昂贵了。
不必要的 namespace 虽然很肿,但不会使XML文档无效。如果您确实需要节省几个字节,并且可以负担得起额外的计算成本,那么编写自己的XML处理器/过滤器应该很容易,它可以接收JAXB输出,解析文档并编写一个没有未使用的命名空间定义的新文档。 。