0

我有以下内容:

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 中。我该怎么做?

提前致谢!

4

2 回答 2

0

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

@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/">

会发生。

于 2012-11-16T01:59:52.757 回答
0

注意: 我是EclipseLink JAXB (MOXy)负责人,也是JAXB (JSR-222)专家组的成员。

您看到的行为会因您使用的 JAXB 实现而异。MOXy 实现将为您提供您正在寻找的结果。我将在下面演示。

JAVA模型

下面是将用于此示例的 Java 模型。包级别@XmlSchema注释将用于指定每个包中的命名空间限定(参见: http ://blog.bdoughan.com/2010/08/jaxb-namespaces.html )。

论坛13408684.aA

package forum13408684.a;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class A {

}

论坛13408684.a.package-info

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

import javax.xml.bind.annotation.*;

论坛13408684.bB

package forum13408684.a;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class B {

}

论坛13408684.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"/>
于 2012-11-16T11:58:46.607 回答