java - @XmlElements 和@XmlJavaTypeAdapter 不能一起工作

标签 java jaxb unmarshalling

我在使用 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;
}

channel 是:

@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")
})

但这会导致一张空 map 。

@XmlElement(name="Update")@XmlElement(name="Erase") 的硬编码适用于一个或其他输入 XML 文档但我需要一些可以与包装元素中的任何一个一起使用的东西。我尝试使用 @XmlElementWrapper,但它只能用于集合或数组属性,因为 allChannels 是一个 HashMap,所以它不起作用。

我能否解释一下我对 @XmlElements 注释的误解以及使它起作用的方法?谢谢!

最佳答案

据我所知,JAXB 强制您拥有双向数据模型;在不违反此约定的情况下,您不能将一个节点的两个子节点合并为一个节点。因此,您需要有两个列表,一个用于更新,一个用于删除。

因为我从未使用过@XmlElements 注释,请谨慎对待我的评论。

关于java - @XmlElements 和@XmlJavaTypeAdapter 不能一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5551130/

相关文章:

java - 解码 XML 文件中的一对一关系

java - 使用动态元素进行 JAXB 解码

java - Android设备java中的串行通信

jpa - 如何在 JAXB 反序列化后在合并时忽略具有空值的 JPA ManyToOne 属性?

Java JAXB : XML to Java object conversion

json - 检查 json 数组长度而不解码

java - 编码将 jlist 的菜单项保存到 XML 并解码加载菜单项

java - 如何在浏览器中自动化 Java applet

java - Lombok 和斯波克 : @RequiredArgsConstructor doesn't hide default no-args constructor for a field with a type of interface

java - Quartz cron 表达式在周六的不同时间运行