2014-11-21 96 views
1

我試圖從JAXB RI 2.2.7切換到MOXy JAXB 2.5.2實現。 我注意到在生成的XML輸出片段中的命名空間和前綴以下區別:MOXy創建比JAXB不同的命名空間前綴RI

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> 

莫西:

<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)我使用「com.sun.xml.bind.marshaller.NamespacePrefixMapper」的實例來指示應該使用的前綴。然而,MOXy在iso4217命名空間中不會調用這個,爲什麼(我調試了MOXy命名空間解析器但有點丟失了)? BTW:Moxy使用prefixMapper作爲其他命名空間(比如「xbrli」),但不是這個iso4217,有什麼區別?

我添加了「bd-algemeen」,因爲前綴映射器被稱爲前綴「bd-algemeen」。該映射不使用iso4217所使用的QName。 3)我在生成的iso4217封裝中的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使用的,但這也是直接在其他地方使用並正確使用。例如,莫西能夠生成這個片段:

<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代碼中查找的地方也許?)。

+0

其中的EclipseLink莫西的版本您使用的? – 2014-11-21 18:43:43

+0

對不起,我忘記了,只是添加了它(RI:2.2.7; Moxy:2.5.2) – edbras 2014-11-21 18:46:31

+0

MOXy根本沒有擊中'NamespacePrefixMapper',還是擊中了所有元素,但不是合格的文本值? – 2014-11-21 18:53:49

回答

0

我得到了它與正確的名稱空間符號的工作,也就是說,它產生:

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

我花了一些(很多)的時間調試莫西代碼和比較被正確使用的命名空間和發現上述代碼片段的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(根標籤)映射時,它會遍歷屬性,這些屬性之一是屬性「itemsAndTuplesAndContexts」。然後它通過關聯的引用元素(Moxy代碼:MappingGenerator.generateMappingForReferenceProperty(..))進行循環,並將它們添加到其名稱空間解析器映射中,並生成前綴,該映射存儲在它的描述符中。 編組期間,它將使用前綴映射器來映射其存儲的名稱空間。因爲我爲iso4217元素添加了@XmlElementDecl聲明,所以它找到了一個引用元素,因此它被添加到Xbrl根元素的名稱空間解析器映射中,並在編組期間在前綴映射器中使用。

有幾個問題我沒有很明確:

  1. 爲什麼莫西需要此@XmlElementDecl,而不是由JAXB RI?
  2. 爲什麼在使用XJC生成代碼期間不會生成這個@XmlElementDecl元素?
  3. @Blaise:你認爲這是一個錯誤?

財產 「itemsAndTuplesAndContexts」 聲明:

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

您所看到的行爲是一個錯誤,我已經打開了下面的問題吧:

+0

Wowwww,我知道你很快......但這很快;)...我只是增加了一些更多的工作場景...謝謝,我直到監視bug ...任何想法,直到它解決了(一週,幾個月,..)? 解決方法? 我可以提供更多調試信息嗎? – edbras 2014-11-21 19:49:40

+0

請將您對我在此主題中答案的反饋意見發送給我? – edbras 2014-11-23 13:04:03