我正在实现 XMPP 的自制子协议(protocol),并且我正在使用 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>
有什么办法可以改变吗?
所有这些 namespace 都用在由 JAXB 编码/解码的不同消息中,但每条消息都使用一个 namespace 。
附言。我不是 XML 专家,如果我犯了一些愚蠢的错误,请不要责备我;)
最佳答案
您正在寻找的功能是在 issue 103 中请求作为 JAXB 问题跟踪器的增强功能的。 .增强功能被拒绝了,因为 JAXB 作者发现在实际序列化开始确定实际需要哪些 namespace 之前再次遍历对象树的成本太高。
虽然相当臃肿,但不必要的 namespace 并没有使 XML 文档失效。如果您真的需要节省几个字节并且可以承受额外的计算成本,那么编写您自己的 XML 处理器/过滤器应该很容易,它采用 JAXB 输出,解析文档并编写一个没有未使用的 namespace 定义的新文档.
关于java - JAXB 将不需要的 namespace 声明附加到标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1673626/