使用JAXB将多个XML元素解组到一个字段

时间:2015-03-11 14:16:13

标签: java xml jaxb

我有一个XML文件,格式如下所述。我目前正在使用JAXB将XML元素(event)解组为Java对象(Event)。所有房产都很好,除了一个...... 正如您在XML中看到的那样,date元素仅存储 日期,而time只存储 事件的时间。我想将这两个XML元素组合成一个名为time LocalDataTime 字段,并使用适当的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来实现此目的。这些setter每个只会改变存储时间的时间或日期。但是我无法让它工作,这似乎是一种非常难看的方式。

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

是否有人知道如何使用 clean 方式单独使用JAXB?

1 个答案:

答案 0 :(得分:1)

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

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

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