入力 XML が 2 つの要素のいずれかでラップされる可能性があるという点で、JAXB アンマーシャリングに小さな問題があります。次に例を示します。
<Output>
<Update>
<Channel>
<id>1</id>
</Channel>
<Channel>
<id>2</id>
</Channel>
</Update>
</Output>
また
<Output>
<Erase>
<Channel>
<id>1</id>
</Channel>
</Erase>
</Output>
私のルート クラスは@XmlJavaTypeAdapter を使用してチャネルを HashMap にアンマーシャリングしており、以下のコードは期待どおりに動作します。
@XmlRootElement(name="Output")
public class Output{
@XmlElement(name="Update")
@XmlJavaTypeAdapter(ChannelAdapter.class)
private HashMap<Long, Channel> allChannels;
public Map getChannels() {
return allChannels;
}
}
Channelsクラスは次のとおりです。
public class Channels {
@XmlElement(name="Channel")
public Channel[] channels;
}
チャネルは次のとおりです。
@XmlAccessorType(XmlAccessType.FIELD)
public class Channel {
@XmlPath("id/text()")
private Long id;
}
最後にChannelAdapterは次のとおりです。
public class ChannelAdapter extends XmlAdapter<Channels, Map<Long, Channel>> {
@Override
public Map<Long, Channel> unmarshal(Channels value) { ... }
@Override
public Channels marshal(Map<Long, Channel> map) { ... }
}
しかし、私は単に置き換えることができると思っ@XmlElement(name="Update")
た
@XmlElements({
@XmlElement(name="Update"),
@XmlElement(name="Erase")
})
しかし、それは空のマップになります。
いずれかの入力 XML ドキュメントをハードコーディングするか、いずれ@XmlElement(name="Update")
か@XmlElement(name="Erase")
で動作しますが、いずれかのラッパー要素で動作するものが必要です。を使用してみましたが、 allChannelsが HashMap であるため機能@XmlElementWrapper
しないコレクションまたは配列プロパティでのみ使用できます。
@XmlElements
注釈について私が誤解していることと、これを機能させる方法について説明してもらえますか? ありがとう!