2

次のような XML ドキュメントがあります。

スキーマは標準の XML スキーマ (Library of Congress 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>が、これら 2 つのタイプだけに制限されているわけではありません。(以下のように) 2 つのクラスを作成すると、マーシャリングは問題ありませんが、これはアンマーシャリングには機能しません。

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@XmlRootElementwrappedMDXmlAnyElement

于 2013-01-31T21:05:29.483 に答える