JAXB 和编组
Posted
技术标签:
【中文标题】JAXB 和编组【英文标题】:JAXB and marshalling 【发布时间】:2012-11-16 00:32:58 【问题描述】:我有以下:
JAXBContext context = JAXBContext.newInstance(A.class, B.class, C.class, D.class);
假设 A、B、C、D 是来自具有不同命名空间的不同模式的类。
我正在按如下方式创建 Marshaller 对象:
Marshaller m = context.createMarshaller();
然后我使用这个 Marshaller m 将 A 的实例转换为 XML。
在生成 XML 代码时,Marshaller 对象还会放入与 B、C 和 D 关联的其他命名空间。
我看到如下内容:
<?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 中。我该怎么做?
提前致谢!
【问题讨论】:
您是否为每个类设置了命名空间?如果你还没有告诉他们一个命名空间也属于这种情况。 【参考方案1】:注意:我是EclipseLink JAXB (MOXy) 领导,也是JAXB (JSR-222) 专家组的成员。
您看到的行为会因您使用的 JAXB 实现而异。 MOXy 实现将为您提供您正在寻找的结果。我将在下面演示。
JAVA 模型
以下是本示例将使用的 Java 模型。包级别 @XmlSchema
注释将用于指定每个包中的命名空间限定(参见:http://blog.bdoughan.com/2010/08/jaxb-namespaces.html)。
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.*;
forum13408684.b.B
package forum13408684.a;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class B
forum13408684.b.package-info
@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"/>
EclipseLink JAXB (MOXy)
如果您将 MOXy 指定为您的 JAXB 提供程序(请参阅:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html),您将获得所需的输出。
<?xml version="1.0" encoding="UTF-8"?>
<a xmlns="A"/>
<?xml version="1.0" encoding="UTF-8"?>
<ns0:b xmlns:ns0="B"/>
【讨论】:
【参考方案2】:使用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.;
如果没有命名空间应用于编组对象 this
<ns4:A
xmlns:ns4="http://a.com/"
xmlns:ns5="http://b.com/"
xmlns:ns6="http://c.com/"
xmlns:ns7="http://d.com/">
会发生的。
【讨论】:
以上是关于JAXB 和编组的主要内容,如果未能解决你的问题,请参考以下文章