我有一个类似于以下内容的XML文档:
请注意,我无法更改架构,因为它是标准XML架构(国会图书馆METS)的一部分。
<amdSec ID="AMDSEC001">
<digiprovMD ID="DMD001">
<mdWrap MDTYPE="OBJECT">
<xmlData>
<object xsi:type="file">
.....
</object>
</xmlData>
</mdWrap>
</digiprovMD>
<digiprovMD ID="DMD001_EVENT">
<mdWrap MDTYPE="EVENT">
<xmlData>
<event xsi:type="event">
.....
</event>
</xmlData>
</mdWrap>
</digiprovMD>
</amdSec>
如您所见,内部元素<mdWrap>
可以包含不同类型的元素;在这种情况下,它们是<event>
和<object>
,但它并不仅限于这两种类型。创建两个类(如下所示),编组好,但这不适用于解组。
class ObjectMDWrap {
@XmlElementWrapper(name = "xmlData")
@XmlElement(name = "object")
List<MyObject> object; //Wrapped in list to use @XmlElementWrapper
}
class EventMDWrap {
@XmlElementWrapper(name = "xmlData")
@XmlElement(name = "event")
List<MyEvent> event; //Wrapped in list to use @XmlElementWrapper
}
我能做些什么让JAXB解组MDWrap的正确“类型”?
答案 0 :(得分:1)
我认为,在这种情况下,最好的解决方案是使用XJC工具生成POJO类。
答案 1 :(得分:0)
我能够找到解决方案,并且它比我最初想象的要简单得多(这说明我对XML和JAXB的相对缺乏经验)。通过以下方式创建我的MDWrap
课程
class MDWrap {
@XmlAnyElement(lax = true)
@XmlElementWrapper(name = "xmlData")
Object wrappedMD;
}
然后MDWrap
可以包含任何类型的对象,并且只要wrappedMD
是其实例的类用@XmlRootElement
注释,就会正确解组。诀窍是将wrappedMD
注释为XmlAnyElement
。