Я пишу программу, анализирующую схему, и у меня ее читают в схеме в объекты JAXB.Для этого я автоматически сгенерировал классы из схемы для схем XML .
Для класса Group
было сгенерировано это поле, которое представляет список всех различныхконструкции, которые могут входить в группу: вложенные группы, последовательности, варианты, anys, alls и элементы.Вот сгенерированный код:
@XmlElementRefs({
@XmlElementRef(name = "group",
namespace = "http://www.w3.org/2001/XMLSchema",
type = JAXBElement.class,
required = false),
@XmlElementRef(name = "sequence",
namespace = "http://www.w3.org/2001/XMLSchema",
type = JAXBElement.class,
required = false),
@XmlElementRef(name = "choice",
namespace = "http://www.w3.org/2001/XMLSchema",
type = JAXBElement.class,
required = false),
@XmlElementRef(name = "any",
namespace = "http://www.w3.org/2001/XMLSchema",
type = Any.class,
required = false),
@XmlElementRef(name = "all",
namespace = "http://www.w3.org/2001/XMLSchema",
type = JAXBElement.class,
required = false),
@XmlElementRef(name = "element", namespace = "http://www.w3.org/2001/XMLSchema",
type = JAXBElement.class,
required = false) })
protected List<Object> particle = new ArrayList<>();
Проблема в том, что большинство этих элементов списка генерируются как JAXBElements, которые содержат фактический объект.Я знаю, что это происходит потому, что, например, выбор и последовательность на самом деле содержат одни и те же данные (оба типа explicitGroup
, это просто имя элемента, который определяет, как интерпретировать данные).Поэтому JAXB только что создал класс ExplicitGroup
и, если это выбор или последовательность, он в конечном итоге будет JAXBElement, содержащий ExplicitGroup и QName, сообщающий вам, какой это.
Я создал пользовательские классыChoice
и Sequence
, которые расширяются ExplicitGroup
.Как я могу заставить JAXB создавать эти классы вместо использования оболочек JAXBElement?