2

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

4

2 回答 2

1

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

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

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

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

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

于 2013-01-31T21:05:29.483 回答