2014-11-21 2 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> 

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) Я использую экземпляр «com.sun.xml.bind.marshaller.NamespacePrefixMapper», чтобы указать префикс, который следует использовать. Однако MOXy не вызывает это в случае пространства имен iso4217, почему (я отлаживал MOXy namespace resolver, но немного потерял;)? BTW: префиксMapper используется Moxy для других пространств имен (например, «xbrli»), но не для этого iso4217, в чем разница?

Я haved добавил «bd-algemeen», поскольку префикс mapper вызывается для префикса «bd-algemeen». Это сопоставление не использует QName, как используется iso4217.

3) Я попробовал аннотацию @XmlSchema в pacakage-info.java в сгенерированном iso4217 pacakge, чтобы определить префикс, но не повезло, и я не хочу использовать его, поскольку он касается сгенерированного кода, который легко перезаписывается ,

домен объекта:

@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?).

+0

Какая версия EclipseLink Moxy вы используете? –

+0

Извините, я просто забыл, только что добавил (RI: 2.2.7; Moxy: 2.5.2) – edbras

+0

МОКСИ вообще не попадает в 'NamespacePrefixMapper', или он ударяет его по всем элементам, но не по значению текстового значения? –

ответ

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 (корневой тег), это будет цикл по свойствам, и один из этих свойств является свойство «itemsAndTuplesAndContexts». Затем он перемещается по связанным ссылочным элементам (код Moxy: MappingGenerator.generateMappingForReferenceProperty (..)) и добавляет их к своей карте распознавателя пространства имен с сгенерированным префиксом, который хранится в его дескрипторе. Во время сортировки он будет использовать префикс-картограф для сопоставления хранящихся им пространств имен. Поскольку я добавил объявление @XmlElementDecl для элемента iso4217, он нашел ссылочный элемент и, как таковой, добавлен в карту распознавателя пространства имен корневого элемента Xbrl и как таковой используется при сортировке в префикс-картере.

Несколько вопросов, которые я не очень ясно:

  1. Почему это @XmlElementDecl требуется Moxy, а не по JAXB RI?
  2. Почему эти элементы @XmlElementDecl не были созданы во время генерации кода с помощью XJC?
  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, я знаю, что вы быстр ... но это очень быстро;) ... Я просто добавил несколько рабочих сценариев ... Спасибо, я досмотрел ошибку ... Любая идея, пока она не будет решена (неделя, месяцы , ..)? Обходной путь? Могу ли я предоставить дополнительную информацию об отладке? – edbras

+0

Пожалуйста, ваши отзывы о моем ответе в этой теме? – edbras

Смежные вопросы