我知道我可以使用@XmlSchema 来做到这一点,但问题是我们在同一个包中有一个类,它需要它的命名空间与 package-info.java 上定义的不同。因此,我们改为在 @XmlRootElement 中声明命名空间(当然,在仍然有 @XmlSchema 的情况下)。但是这样做不允许我们设置类的 elementFormDefault。将类移动到不同的包不是一种选择。基本上,我只想覆盖这个特定类的命名空间。
问问题
10793 次
1 回答
5
TL;博士
当elementFormDefault=XmlNsForm.QUALIFIED
设置为 on 时@XmlSchema
,您可以通过使用 注释来覆盖类属性的命名空间@XmlType(namespace="ANOTHER_NAMESPACE")
。如果您想覆盖根元素的命名空间,您可以执行@XmlRootElement(namespace="DIFFERENT_NAMESPACE)
.
了解更多信息
JAVA模型
酒吧
您只需要@XmlType
在类的注释上设置命名空间Bar
。
package forum14579814;
import javax.xml.bind.annotation.XmlType;
@XmlType(namespace="FOO")
public class Bar {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
包信息
这将覆盖您在包级别@XmlSchema
注释中指定的命名空间。
@XmlSchema(namespace="FOO2", elementFormDefault=XmlNsForm.QUALIFIED)
package forum14579814;
import javax.xml.bind.annotation.*;
富
这个对象是你的域模型的根。
package forum14579814;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Foo {
private Bar bar;
public Bar getBar() {
return bar;
}
public void setBar(Bar bar) {
this.bar = bar;
}
}
XML 模式
以下是您通过http://jsfiddle.net/supertonsky/Phck5/提供的 XML 模式。
Foo.xsd
<?xml version="1.0" encoding="UTF-8"?>
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="FOO2"
xmlns:tns="FOO2"
xmlns:tns2="FOO"
elementFormDefault="qualified">
<import namespace="FOO" schemaLocation="BAR.xsd"></import>
<element name="foo" type="tns:Foo"></element>
<complexType name="Foo">
<sequence>
<element name="bar" type="tns2:Bar"></element>
</sequence>
</complexType>
</schema>
吧.xsd
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="FOO"
xmlns:tns="FOO"
elementFormDefault="qualified">
<complexType name="Bar">
<sequence>
<element name="name" type="string" maxOccurs="1" nillable="true"></element>
</sequence>
</complexType>
</schema>
演示代码
以下演示代码将创建域对象的实例并将其输出到 XML。XML 输出将在编组操作期间针对您提供的 XML 模式进行验证。
package forum14579814;
import java.io.File;
import javax.xml.XMLConstants;
import javax.xml.bind.*;
import javax.xml.validation.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Foo.class);
Bar bar = new Bar();
bar.setName("BAR");
Foo foo = new Foo();
foo.setBar(bar);
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(new File("src/forum14579814/Foo.xsd"));
Marshaller marshaller = jc.createMarshaller();
marshaller.setSchema(schema);
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(foo, System.out);
}
}
输出
然后你会得到以下输出。请注意,与属性 onname
对应的元素是如何使用命名空间限定的,而所有其他元素是如何使用命名空间限定的。name
Bar
FOO
FOO2
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:foo xmlns="FOO" xmlns:ns2="FOO2">
<ns2:bar>
<name>BAR</name>
</ns2:bar>
</ns2:foo>
于 2013-01-29T09:55:05.817 回答