处理同一组元素中包含的不同对象类型

时间:2013-01-30 22:44:32

标签: java xml jaxb

我有一个类似于以下内容的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的正确“类型”?

2 个答案:

答案 0 :(得分:1)

我认为,在这种情况下,最好的解决方案是使用XJC工具生成POJO类。

  1. 下载描述XML文件的XSD文件。
  2. 使用XJC工具将XSD文件转换为POJO类。如果XSD不正确 - 请修复它。
  3. 如果您需要在生成的课程中进行一些更改。
  4. 在编组/解组过程中使用此类。

答案 1 :(得分:0)

我能够找到解决方案,并且它比我最初想象的要简单得多(这说明我对XML和JAXB的相对缺乏经验)。通过以下方式创建我的MDWrap课程

class MDWrap {
    @XmlAnyElement(lax = true)
    @XmlElementWrapper(name = "xmlData")
    Object wrappedMD;
}

然后MDWrap可以包含任何类型的对象,并且只要wrappedMD是其实例的类用@XmlRootElement注释,就会正确解组。诀窍是将wrappedMD注释为XmlAnyElement