Java JAXB和编组

Java JAXB和编组,java,jaxb,marshalling,Java,Jaxb,Marshalling,我有以下资料: JAXBContext context = JAXBContext.newInstance(A.class, B.class, C.class, D.class); <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ns4:A xmlns:ns4="http://a.com/" xmlns:ns5="http://b.com/" xmlns:ns6="http://c.com/" xmlns:

我有以下资料:

JAXBContext context = JAXBContext.newInstance(A.class, B.class, C.class, D.class);
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns4:A 
xmlns:ns4="http://a.com/" 
xmlns:ns5="http://b.com/"
xmlns:ns6="http://c.com/"
xmlns:ns7="http://d.com/">
<ns4:Foo></ns4:Foo>
</ns4:A>
假设A、B、C、D是来自具有不同名称空间的不同模式的类

我正在创建Marshaller对象,如下所示:

Marshaller m = context.createMarshaller();
然后我使用这个Marshaller m将一个实例转换为XML

生成XML代码时,Marshaller对象还放置与B、C和D关联的其他名称空间

我看到如下情况:

JAXBContext context = JAXBContext.newInstance(A.class, B.class, C.class, D.class);
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns4:A 
xmlns:ns4="http://a.com/" 
xmlns:ns5="http://b.com/"
xmlns:ns6="http://c.com/"
xmlns:ns7="http://d.com/">
<ns4:Foo></ns4:Foo>
</ns4:A>

我不希望ns5、ns6和ns7被添加到XML中。我该怎么做


提前谢谢

使用
package info.java
将命名空间绑定到包中的类,如下所示:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://nameSpaceUri"
, xmlns = {
    @XmlNs(prefix = "myPrefix", namespaceURI = "http://nameSpaceUri")
}
, elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)

package my.package.;
如果未将命名空间应用于封送处理的对象,则此

<ns4:A 
xmlns:ns4="http://a.com/" 
xmlns:ns5="http://b.com/"
xmlns:ns6="http://c.com/"
xmlns:ns7="http://d.com/">


将会发生。

注意:我是专家组的负责人和成员

您看到的行为将不同于您正在使用的JAXB的实现。MOXy实现将为您提供所需的结果。我将在下面演示

JAVA模型

下面是本例将使用的Java模型。包级别的
@XmlSchema
注释将用于指定每个包中的名称空间限定(请参阅:)

forum13408684.a.a

package forum13408684.a;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class A {

}
forum13408684.a.package-info

@XmlSchema(namespace="A", elementFormDefault=XmlNsForm.QUALIFIED)
package forum13408684.a;

import javax.xml.bind.annotation.*;
@XmlSchema(namespace="B", elementFormDefault=XmlNsForm.QUALIFIED)
package forum13408684.b;

import javax.xml.bind.annotation.*;
forum13408684.b.b

package forum13408684.a;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class B {

}
forum13408684.b.包装信息

@XmlSchema(namespace="A", elementFormDefault=XmlNsForm.QUALIFIED)
package forum13408684.a;

import javax.xml.bind.annotation.*;
@XmlSchema(namespace="B", elementFormDefault=XmlNsForm.QUALIFIED)
package forum13408684.b;

import javax.xml.bind.annotation.*;

演示代码

package forum13408684;

import javax.xml.bind.*;
import forum13408684.a.A;
import forum13408684.b.B;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(A.class, B.class);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(new A(), System.out);
        marshaller.marshal(new B(), System.out);
    }

}

输出

JAXB参考实现

以下输出与您在问题中描述的内容相匹配:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<a xmlns="A" xmlns:ns2="B"/>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:b xmlns="A" xmlns:ns2="B"/>

)您将获得所需的输出


是否为每个类设置了命名空间?如果您没有告诉他们名称空间也属于某个名称空间,就会发生这种情况。