JaxB - как не отображать конкретный узел XML - PullRequest
2 голосов
/ 29 декабря 2011

Вот моя проблема:

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

class Data
{
    private Item item;
}

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

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

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

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

  <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>

Ответы [ 3 ]

1 голос
/ 30 декабря 2011

Примечание: Я 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;
}

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

0 голосов
/ 30 декабря 2011

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

class Data{
  @XmlElementWrapper(name="Items")
  @XmlElement(name="Item")
  private Item[] item;     // An array with just one Item
}
0 голосов
/ 30 декабря 2011

Один из вариантов - написать свой собственный плагин 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", он передаст управление вам и вашему плагину, вы просто проигнорируете его и создадите установщик / получатель для базового элемента. Элемент «Элемент» вместо. Я уверен, что есть и другие варианты, которые так же действительны.

...