JAXB (JSR-222)は、使用される名前空間プレフィックスを指定する標準的な方法を提供しません。
拡大 -NamespacePrefixMapper
JAXB リファレンス実装と EclipseLink JAXB (MOXy) の最近のバージョンでは、NamespacePrefixMapper
拡張機能を使用して、使用されるネームスペース プレフィックスを制御できます。
MyNamespaceMapper
import com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper;
//import com.sun.xml.bind.marshaller.NamespacePrefixMapper;
public class MyNamespaceMapper extends NamespacePrefixMapper {
private static final String FOO_PREFIX = ""; // DEFAULT NAMESPACE
private static final String FOO_URI = "http://www.example.com/FOO";
private static final String BAR_PREFIX = "bar";
private static final String BAR_URI = "http://www.example.com/BAR";
@Override
public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
if(FOO_URI.equals(namespaceUri)) {
return FOO_PREFIX;
} else if(BAR_URI.equals(namespaceUri)) {
return BAR_PREFIX;
}
return suggestion;
}
@Override
public String[] getPreDeclaredNamespaceUris() {
return new String[] { FOO_URI, BAR_URI };
}
}
指定するNamespacePrefixMapper
以下は、 でNamespacePrefixMapper
を設定する方法の例ですMarshaller
。
Marshaller m = ctx.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
try {
m.setProperty("com.sun.xml.internal.bind.namespacePrefixMapper", new MyNamespaceMapper());
//m.setProperty("com.sun.xml.bind.namespacePrefixMapper", new MyNamespaceMapper());
} catch(PropertyException e) {
// In case another JAXB implementation is used
}
拡張 - 活用@XmlSchema
@XmlSchema
EclipseLink JAXB (MOXy)および最近のバージョンのJAXB参照実装では、パッケージ・レベルの注釈で定義された名前空間接頭辞が使用されます。
@XmlSchema(
elementFormDefault=XmlNsForm.QUALIFIED,
namespace="http://www.example.com/FOO",
xmlns={
@XmlNs(prefix="", namespaceURI="http://www.example.com/FOO")
@XmlNs(prefix="bar", namespaceURI="http://www.example.com/BAR")
}
)
package blog.prefix;
import javax.xml.bind.annotation.*;
詳細については