1

我编组了一些对象,但问题是 JAXB 编写默认命名空间前缀而不是预定义的前缀。有什么想法会导致这个问题吗?

我期望看到的;

<xbrli:entity>
....

我得到了什么;

<ns3:entity>
....

我生成了所有类(包括包信息)

示例包信息;

@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;
4

1 回答 1

1

JAXB (JSR-222)不提供指定使用的命名空间前缀的标准方法。

延期 -NamespacePrefixMapper

对于 JAXB 参考实现和最新版本的 EclipseLink JAXB (MOXy),您可以使用NamespacePrefixMapper扩展来控制使用的名称空间前缀。

我的命名空间映射器

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

下面是如何NamespacePrefixMapperMarshaller.

    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.*;

了解更多信息

于 2013-10-24T13:41:33.887 回答