我正在编写一个模式分析程序,并将其读入JAXB对象的模式中。为此,我已经从schema for XML schemas自动生成了类。
对于Group
类,它生成了此字段,该字段表示可以在一个组中进行的所有不同构造的列表:嵌套的组,序列,选择,任何,全部和元素。这是生成的代码:
@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包装器来创建这些类?