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

Java JAXB将不需要的名称空间声明附加到标记,java,xml,jaxb,xml-namespaces,jaxb2,Java,Xml,Jaxb,Xml Namespaces,Jaxb2,我正在实现XMPP的一个自制子脚本,并使用StAX和JAXB的组合来解析/编组mesage。当我整理一条消息时,我最终得到了大量无需的命名空间声明: <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"

我正在实现XMPP的一个自制子脚本,并使用StAX和JAXB的组合来解析/编组mesage。当我整理一条消息时,我最终得到了大量无需的命名空间声明:

   <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>

compton@ilf
而不是:

   <ns:auth xmlns:ns="urn:ietf:params:xml:ns:ilf-auth>compton@ilf</ns:auth>

您正在寻找的功能是作为中JAXB问题跟踪器的增强而请求的。该增强被拒绝,因为JAXB作者发现在实际序列化开始之前再次遍历对象树以确定实际需要哪些名称空间代价太高


尽管相当臃肿,但不必要的名称空间并不会使XML文档无效。如果您真的需要节省几个字节,并且额外的计算成本是可以承受的,那么编写自己的XML处理器/过滤器应该相当容易,它接受JAXB输出,解析文档并编写新文档,而不使用未使用的名称空间定义

对于必须在运输过程中保存以保持其完整性的法律文件,这是完全不可接受的。JAXB是一种使简单事物更加复杂的方法JAXB使xml解析/生成方法更加容易。我做了一个项目,它同时使用JAXB和dom4j(在两个不同的部分),差别很大。如果您碰巧使用的是CXF: