JAXB Разбор похожих xml-файлов

У меня есть разные возвраты XML, которые я хочу проанализировать с помощью JAXB с аннотированными классами. Многие XML-файлы имеют схожую структуру верхнего уровня и содержимое внутреннего тега, которое может различаться. Поскольку мы отправили ContextInstance класс, а не экземпляр, я не могу добавить классы.

Как бы вы создали набор аннотаций JAXB, которые не повторяют xml верхнего уровня каждый раз, учитывая примеры двух файлов, подобных этому.

<?xml version='1.0' encoding='UTF-8'?>
<eveapi version="2">
  <currentTime>2008-11-24 20:14:29</currentTime>
  <result>
    <serverOpen>True</serverOpen>
    <onlinePlayers>38102</onlinePlayers>
  </result>
  <cachedUntil>2008-11-24 20:17:29</cachedUntil>
</eveapi>

И еще такой файл:

<?xml version='1.0' encoding='UTF-8'?>
<eveapi version="2">
  <currentTime>2012-02-12 14:39:12</currentTime>
  <result>
    <rowset name="characters" key="characterID"     columns="name,characterID,corporationName,corporationID">
      <row name="Alexis Prey" characterID="1365215823" corporationName="Puppies To the     Rescue" corporationID="238510404"/>
    </rowset>
  </result>
  <cachedUntil>2012-02-12 15:27:00</cachedUntil>
</eveapi>

Обычный класс верхнего уровня будет выглядеть примерно так:

@XmlRootElement(name="eveapi")
public class EveApiConfig {
    @XmlElement(required = true)
    protected Date currentTime;

    @XmlElement(required = true)
    protected String cachedUntil;

    @XmlAttribute(name = "version", required = true)
    protected int version;

    @XmlElement(required = true)
    protected ResultsConfig result;
}

Но ResultsConfig будет ряд других вещей. это почти как необходимость обратного XmlSeeAlso

Любые мысли, если как это сделать?


person Streamweaver    schedule 07.12.2012    source источник
comment
Просто добавьте больше здесь. Мой первоначальный вопрос был о желании сохранить один аннотированный класс JAXB с подклассами для каждой конкретной реализации.   -  person Streamweaver    schedule 07.12.2012
comment
Это не выглядит очень СУХИМ, но сейчас я реализую это, сохраняя суперкласс EveApiConfig и создавая подклассы для каждой конкретной реализации. Все еще надеюсь, что есть более элегантный способ сделать это, потерянный в моем нубе JAXB.   -  person Streamweaver    schedule 07.12.2012


Ответы (1)


Я думаю, вы можете добиться этого с помощью нескольких фабрик объектов. Нарисую решение:

  • Превратите result в @XmlElementRef, введите что-то вроде JAXBElement<AbstractResultConfig>
  • В каждом случае создайте один пакет с ObjectFactory
  • В каком из классов ObjectFactory реализован другой фабричный метод @XmlElementDecl, который будет создавать JAXBElement с экземплярами разных подклассов AbstractResultConfig. Что-то вроде:

    @XmlElementDecl(name = "Result")
    public JAXBElement<ResultConfigImpl> createResultConfigImpl(ResultConfigImpl value) {
        return new JAXBElement<ResultConfigImpl>(..., ResultConfigImpl.class, null, value);
    }
    

Я думаю, вам нужно соединить его с методом createResultConfig() или что-то в этом роде.

person lexicore    schedule 02.02.2013