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