我在 JAXB 解组时遇到了一个小问题,因为我的输入 XML 可以由两个元素之一包装,例如:
<Output>
<Update>
<Channel>
<id>1</id>
</Channel>
<Channel>
<id>2</id>
</Channel>
</Update>
</Output>
或者
<Output>
<Erase>
<Channel>
<id>1</id>
</Channel>
</Erase>
</Output>
我的根类使用 @XmlJavaTypeAdapter将Channels解组为 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")
})
但这会导致空地图。
硬编码@XmlElement(name="Update")
或@XmlElement(name="Erase")
与一个或其他输入 XML 文档一起工作,但我需要一些可以与任何一个包装器元素一起工作的东西。我尝试使用 a@XmlElementWrapper
但它只能用于集合或数组属性,因为allChannels是一个 HashMap,所以它不起作用。
我能否解释一下我对@XmlElements
注释的误解以及使其正常工作的方法?谢谢!