【问题标题】:Unmarshalling multiple XML elements to one field using JAXB使用 JAXB 将多个 XML 元素解组到一个字段
【发布时间】:2015-05-13 09:16:13
【问题描述】:

我有一个格式如下所述的 XML 文件。我目前正在使用 JAXB 将 XML 元素 (event) 解组为 Java 对象 (Event)。所有属性都可以正常工作,除了一个...
正如您在 XML 中看到的,date 元素存储日期,time存储事件时间。我想将这两个 XML 元素组合成一个名为 timeLocalDataTime 字段,并带有适当的 getter 和 setter。

XML:

...
<event>
    ...
    <date>2014-02-19</date>
    <time>2000-01-01T14:17:00Z</time>
    ...
</event>
...

所需的 Java 对象:

public class Event {
    ...
    // Returns a combination of the date and time stored in the XML
    public LocalDateTime getDateTime() {
        return dateTime;
    }
    ...
}

我的第一个想法是使用XMLAdapter,但似乎这只允许我将 1 个 XML 元素映射到 1 个 Java 对象。

之后我尝试通过覆盖设置器setTimesetDate 来实现这一点。这些设置器每个都会更改存储时间的时间或日期。但我无法让它工作,而且这似乎也是一种非常丑陋的方式。

我已经阅读了以下JAXB convert multiple attributes to one type while unmarshalling。但是对于这个项目,我宁愿不使用像 MOXy 这样的外部库。

有谁知道如何以 clean 的方式单独使用 JAXB 来做到这一点?

【问题讨论】:

    标签: java xml jaxb


    【解决方案1】:

    您可以在您的 Event 对象生命周期方法中定义:

    void afterUnmarshal(Unmarshaller unm, Object parent) {
        localDateTime = ....
    };
    boolean beforeMarshal(Marshaller mar) {  
        date = localDateTime.toDate();
        ....
    };
    

    在解组后构造 LocalDateTime 属性(使用日期和时间值),并在使用当前 LocalDateTime 值进行编组之前准备日期/时间字段。 您仍然需要时间/日期字段来匹配 xml,并且 localDateTime 字段必须是 XmlTransient。所以它与 set/getter 方法没有太大区别,但可能更“干净”。

    【讨论】:

      猜你喜欢
      • 2011-10-08
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-23
      • 2021-10-18
      • 1970-01-01
      相关资源
      最近更新 更多