2011-12-29 5 views
2

вот моя проблема:JaxB - как не отобразить определенный узел XML

Я работаю над проектом, чтобы перейти от Castor к JaxB. Я очень новичок в JaxB и сталкиваюсь с проблемой, которая поражает мой разум, и, тем не менее, может быть довольно просто решить. Вот простой пример:

class Data 
{ 
    private Item item; 
} 

У меня есть данные, содержащие один элемент. Вот как выглядит выходной файл XML (, который я не могу изменить) как:

<Data> 
    <Items> 
     <Item> 
     <Item> 
    <Items> 
<Data> 

Даже если данные содержат только один элемент, он должен быть представлен в выходном XML в качестве элемента в элементах. Дело в том, что я не хочу, чтобы JaxB генерировал класс или свойство для Items, только Данные и Позиция.

Как должна выглядеть моя схема? Есть ли способ указать в схеме, что указанный элемент хранится в узле, который не имеет представления класса? Кое-что в моей логике может выглядеть так:

<xs:element name="Data"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="Items"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="Items"> <!-- Do not generate plz --> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="Item" minOccurs="1" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

ответ

1

Примечание: Я EclipseLink JAXB (MOXy) свинца и член группы экспертов JAXB 2 (JSR-222).

Для следующего фрагмента не существует способа генерировать классы таким образом, поскольку стандартные API JAXB не предоставляют сопоставление на основе маршрутов.

<xs:element name="Items"> <!-- Do not generate plz --> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="Item" minOccurs="1" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

Однако, начиная с классов Java можно использовать @XmlPath расширения Moxy на карту этого случая использования:

import org.eclipse.persistence.annotations.oxm.XmlPath; 

class Data 
{ 
    @XmlPath("Items/Item") 
    private Item item; 
} 

Для получения более подробной информации

+1

Это помогло мне выбрать другое решение, так как было принято решение о том, что классы не могут быть изменены (мы обнаружили некоторые XML-файлы непосредственно unmarshalled в объекты спящего режима), я начал используйте внешнее отображение метаданных MOXy. – Drewman

0

Один из вариантов, чтобы написать свой собственный JAXB плагин вы можете найти введение здесь: http://weblogs.java.net/blog/kohsuke/archive/2005/06/writing_a_plugi.html. В вашем плагине вы генерируете код с использованием API Codemodel; Я писал об этом здесь: http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/21495. Когда XJC попадет в ваш элемент «Items», он передаст вам управление и ваш плагин, вы просто проигнорируете его и создадите setter/getter для базового элемента «Item». Я уверен, что существуют и другие варианты, которые столь же актуальны.

0

Использование стандартных JAXB аннотациями:

class Data{ 
    @XmlElementWrapper(name="Items") 
    @XmlElement(name="Item") 
    private Item[] item;  // An array with just one Item 
} 
Смежные вопросы