我编写了一些对象,但问题是JAXB写入默认名称空间前缀而不是预定义名称空间前缀。有什么想法会导致这个问题吗?
我期待看到的内容;
<xbrli:entity>
....
我得到了什么;
<ns3:entity>
....
我生成了所有类(包括package-infos)
示例package-info;
@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.xbrl.org/2003/instance",
xmlns = {
@XmlNs(namespaceURI = "http://www.xbrl.org/2003/instance", prefix = "xbrli2")
},
elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package org.xbrl._2003.instance;
import javax.xml.bind.annotation.XmlNs;
答案 0 :(得分:1)
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
EclipseLink JAXB(MOXy)和最新版本的JAXB参考实现将使用在包级别@XmlSchema
注释上定义的名称空间前缀。
@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.*;