Разбор 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

Есть мысли, если как это сделать?

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() метод или что-то вроде этого.

Другие вопросы по тегам