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