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"/>
)您将获得所需的输出
是否为每个类设置了命名空间?如果您没有告诉他们名称空间也属于某个名称空间,就会发生这种情况。