@XmlElements和@XmlJavaTypeAdapter不能一起工作

@XmlElements和@XmlJavaTypeAdapter不能一起工作,java,jaxb,unmarshalling,Java,Jaxb,Unmarshalling,我在JAXB解组方面遇到了一个小问题,因为我的输入XML可以由两个元素之一包装,例如: <Output> <Update> <Channel> <id>1</id> </Channel> <Channel> <id>2</id> </Channel> </Update>

我在JAXB解组方面遇到了一个小问题,因为我的输入XML可以由两个元素之一包装,例如:

<Output>
  <Update>
      <Channel>
          <id>1</id>
      </Channel>
      <Channel>
          <id>2</id>
      </Channel>
  </Update>
</Output>
频道是:

最后,ChannelAdapter是:

但这会导致一张空地图

硬编码到
@xmlement(name=“Update”)
@xmlement(name=“Erase”)
可以用于一个或另一个输入XML文档,但我需要一些可以用于任何包装器元素的东西。我尝试使用
@xmlementwrapper
,但这只能在集合或数组属性上使用,因为allChannels是一个HashMap,所以无法工作


我能解释一下我对
@xmlmelements
注释有什么误解吗?还有一种方法可以让它工作吗?谢谢

据我所知,JAXB迫使您拥有一个双向数据模型;如果不打破此约定,则无法将节点的两个子节点合并为一个子节点。因此,您需要有两个列表,一个用于更新,一个用于擦除


因为我从来没有使用过@XmlElements注释,所以请注意我的评论。

尝试将XSD更改为允许XML使用其中一个元素,但决不能同时使用这两个元素的选项

但是,我不知道如何通过XmlElements对其进行注释。首先尝试构建XSD,然后生成用于查找注释的类;)

<Output>
  <Erase>
      <Channel>
          <id>1</id>
      </Channel>
  </Erase>
</Output>    
@XmlRootElement(name="Output")
public class Output{
    @XmlElement(name="Update")
    @XmlJavaTypeAdapter(ChannelAdapter.class)
    private HashMap<Long, Channel> allChannels;
    public Map getChannels() {
        return allChannels;
    }
}
public class Channels {
    @XmlElement(name="Channel")
    public Channel[] channels;
}
@XmlAccessorType(XmlAccessType.FIELD)
public class Channel {
    @XmlPath("id/text()")
    private Long id;
}
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) { ... }
}
@XmlElements({
    @XmlElement(name="Update"),
    @XmlElement(name="Erase")
})