MOXy创建与JAXB RI不同的名称空间前缀

时间:2014-11-21 18:35:19

标签: jaxb moxy

我正在尝试从JAXB RI 2.2.7切换到MOXy JAXB 2.5.2实现。 我注意到生成的XML输出片段中的命名空间和前缀存在以下差异:

JAXB RI:

<xbrli:xbrl xmlns:xbrli="http://www.xbrl.org/2003/instance" xmlns:bd-algemeen="http://www.nltaxonomie.nl/7.0/basis/bd/items/bd-algemeen" xmlns:iso4217="http://www.xbrl.org/2003/iso4217">
   <bd-algemeen:OperatingSystem contextRef="cc_131">W</bd-algemeen:OperatingSystem>
   <xbrli:unit id="uu_692">
        <xbrli:measure>iso4217:EUR</xbrli:measure>
    </xbrli:unit>
</xbrli:xbrl>

MOXY:

<xbrli:xbrl xmlns:xbrli="http://www.xbrl.org/2003/instance" xmlns:bd-algemeen="http://www.nltaxonomie.nl/7.0/basis/bd/items/bd-algemeen">
  <bd-algemeen:OperatingSystem contextRef="cc_131">W</bd-algemeen:OperatingSystem>
  <xbrli:unit id="uu_662">
    <xbrli:measure xmlns:ns0="http://www.xbrl.org/2003/iso4217">ns0:EUR</xbrli:measure>
   </xbrli:unit>
</xbrli:xbrl>

1)如何配置MOXy以输出与RI相同的值? MOXy输出有效,但我创建的XML(实际上是XBRL)文档必须具有预定义的前缀。

2)我使用&#34; com.sun.xml.bind.marshaller.NamespacePrefixMapper&#34;的实例。指示应该使用的前缀。但是,对于iso4217命名空间,MOXy不会调用它,为什么(我调试了MOXy命名空间解析器,但有点丢失了)? 顺便说一下:前缀Mapper被Moxy用于其他命名空间(比如&#34; xbrli&#34;),但不是这个iso4217,有什么区别?

我已添加&#34; bd-algemeen&#34;,因为前缀映射器被调用前缀&#34; bd-algemeen&#34;。此映射不使用iso4217使用的QName。

3)我在生成的iso4217 pacakge中的pacakage-info.java中尝试了@XmlSchema注释,以定义前缀,但没有运气,我也不想使用它,因为它涉及容易被覆盖的生成代码。

域对象:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "divide", "measures" })
@XmlRootElement(name = "unit")
public class Unit {
    protected Divide divide;

    @XmlElement(name = "measure")
    protected List<QName> measures;
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "operatingSystem"})
public static class TaxDataBedrijf  {

   @XmlElement(name = "OperatingSystem", namespace = "http://www.nltaxonomie.nl/7.0/basis/bd/items/bd-algemeen")
   protected Astring1ItemType operatingSystem;

创建单元实例:

final Unit item = new Unit();
item.getMeasures().add(new QName("http://www.xbrl.org/2003/iso4217", "EUR", "iso4217"));

taxData = new TaxDataBedrijf();
taxData.setOperatingSystem(createOperatingSystem(context, 'W'));

我认为可能是因为 QName用法,但这也直接在其他地方使用并且使用正确。例如,Moxy能够生成此代码段:

<xbrli:xbrl xmlns:xbrli="http://www.xbrl.org/2003/instance" xmlns:bd-domains="http://www.nltaxonomie.nl/7.0/basis/bd/domains/bd-domains" xmlns:bd-axes="http://www.nltaxonomie.nl/7.0/domein/bd/axes/bd-axes">
  <xbrli:scenario>
     <xbrldi:explicitMember dimension="bd-axes:TimeDimension">bd-domains:Current</xbrldi:explicitMember>
  </xbrli:scenario>
</xbrli:xbrl>

和相应的java绑定:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "value" })
@XmlRootElement(name = "explicitMember")
public class ExplicitMember {

    @XmlValue
    protected QName value;

    @XmlAttribute(name = "dimension")
    protected QName dimension;
}

它的创作:

final ExplicitMember item = new ExplicitMember();
item.setDimension(new QName("http://www.nltaxonomie.nl/7.0/domein/bd/axes/bd-axes", "TimeDimension"));
item.setValue(new QName("http://www.nltaxonomie.nl/7.0/basis/bd/domains/bd-domains", "Current"));

请提供一些关于如何解决这个问题的建议,以便我可以使用MOXy代替RI(可能在哪里查看Moxy代码?)。

2 个答案:

答案 0 :(得分:1)

您看到的行为是一个错误,我已经为它打开了以下问题:

答案 1 :(得分:0)

我使用正确的命名空间表示法,即它生成:

<xbrli:unit id="uu_382">
     <xbrli:measure>iso4217:EUR</xbrli:measure>
</xbrli:unit>

我花了一些时间来调试Moxy代码并比较正确使用的命名空间,并发现上述代码段的ObjectFactory不包含任何@XmlElementDecl注释,就像那些正在工作的注释一样。添加它时,它可以工作,即:

private static final QName EUR_QNAME = new QName("http://www.xbrl.org/2003/iso4217", "EUR", "iso4217");

@XmlElementDecl(namespace = "http://www.xbrl.org/2003/iso4217", name = "EUR", substitutionHeadNamespace = "http://www.xbrl.org/2003/instance", substitutionHeadName = "item")
public JAXBElement<EUR> createEURO() {
    return new JAXBElement<EUR>(EUR_QNAME, EUR.class, null, createEUR());
}

我注意到,当创建Xbrl(根标记)映射时,它将遍历属性,其中一个属性是属性&#34; itemsAndTuplesAndContexts&#34;。然后循环遍历相关的引用元素(Moxy代码:MappingGenerator.generateMappingForReferenceProperty(..)),并将它们添加到它的带有生成前缀的命名空间解析器映射,该映射存储在它的描述符中。 在编组期间,它将使用前缀映射器来映射其存储的命名空间。因为我为iso4217元素添加了@XmlElementDecl声明,所以它找到了一个引用元素,因此它被添加到Xbrl根元素的名称空间解析器映射中,并且因此在前缀的编组期间使用映射器。

一些我不太清楚的问题:

  1. 为什么Moxy需要@XmlElementDecl,而不是JaxB RI?
  2. 为什么在使用XJC生成代码期间没有生成这个@XmlElementDecl元素?
  3. @Blaise:你认为这是一个错误吗?
  4. property&#34; itemsAndTuplesAndContexts&#34;声明:

    @XmlElementRefs({ @XmlElementRef(name = "unit", namespace = "http://www.xbrl.org/2003/instance", type = Unit.class),
      @XmlElementRef(name = "context", namespace = "http://www.xbrl.org/2003/instance", type = Context.class),
      @XmlElementRef(name = "item", namespace = "http://www.xbrl.org/2003/instance", type = JAXBElement.class),
      @XmlElementRef(name = "tuple", namespace = "http://www.xbrl.org/2003/instance", type = JAXBElement.class),
      @XmlElementRef(name = "footnoteLink", namespace = "http://www.xbrl.org/2003/linkbase", type = JAXBElement.class) })
        protected List<Object> itemsAndTuplesAndContexts;