java - JAXB 将不需要的 namespace 声明附加到标记

标签 java xml jaxb xml-namespaces jaxb2

我正在实现 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/

相关文章:

java - HttpSession 超时后重定向

JavaPoet - 内部类类型的字段

Java - 密码的正则表达式

java - 即使初始化后列表仍为空

java - 将焦点从一个 JTree 节点转移到另一个

java - JAXB 是否支持内联元素?

java - 使用 MOXy 和 XPath,是否可以解码属性列表?

xml - XML 模式中的复杂断言

c# - 在 C# 中向 XML 文件添加信息

java - @ResponseBody 和语言导致编码错误