@XmlSchemaを使用してこれを行うことができることは知っていますが、問題は、同じパッケージ内に、package-info.javaで定義されているものとは異なる名前空間を必要とするクラスがあることです。そのため、代わりに@XmlRootElementで名前空間を宣言しました(もちろん、@ XmlSchemaを配置したままです)。ただし、これを行うと、クラスのelementFormDefaultを設定できなくなります。クラスを別のパッケージに移動することはできません。基本的に、この特定のクラスの名前空間をオーバーライドしたいだけです。
1 に答える
TL; DR
elementFormDefault=XmlNsForm.QUALIFIED
がオンに設定されている場合@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;
}
}
package-info
@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>
Bar.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);
}
}
出力
次に、次の出力が得られます。上のプロパティにname
対応する要素が名前空間で修飾されているのに対し、他のすべての要素は名前空間で修飾されていることに注意してください。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>