使用 JAXB 将多个 XML 元素解组到一个字段
Unmarshalling multiple XML elements to one field using JAXB
我有一个 XML 文件,格式如下。我目前正在使用 JAXB 将 XML 元素 (event
) 解组为 Java 对象 (Event
)。所有属性都工作正常,除了一个...
正如您在 XML 中看到的,date
元素仅存储 日期,而 time
仅存储 [=43] =] 事件发生的时间。我想将这两个 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 对象。
之后,我尝试通过覆盖设置器 setTime
和 setDate
来实现它。这些设置器每个都会更改存储时间的时间或日期。但我无法让它工作,而且它似乎也是一种非常丑陋的方式来做到这一点。
我已经阅读了以下内容JAXB convert multiple attributes to one type while unmarshalling。但是对于这个项目,我宁愿不使用像 MOXy 这样的外部库。
有谁知道如何以 干净 的方式仅使用 JAXB 来做到这一点?
您可以在事件对象生命周期方法中定义:
void afterUnmarshal(Unmarshaller unm, Object parent) {
localDateTime = ....
};
boolean beforeMarshal(Marshaller mar) {
date = localDateTime.toDate();
....
};
在解组后(使用日期和时间值)构造 LocalDateTime 属性,并在使用当前 LocaLDateTime 值编组之前准备 date/time 字段。
您仍然需要 time/date 字段来匹配 xml 并且 localDateTime 字段必须是 XmlTransient。所以它与 set/getter 方法没有太大区别,但可能更 "clean"。
我有一个 XML 文件,格式如下。我目前正在使用 JAXB 将 XML 元素 (event
) 解组为 Java 对象 (Event
)。所有属性都工作正常,除了一个...
正如您在 XML 中看到的,date
元素仅存储 日期,而 time
仅存储 [=43] =] 事件发生的时间。我想将这两个 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 对象。
之后,我尝试通过覆盖设置器 setTime
和 setDate
来实现它。这些设置器每个都会更改存储时间的时间或日期。但我无法让它工作,而且它似乎也是一种非常丑陋的方式来做到这一点。
我已经阅读了以下内容JAXB convert multiple attributes to one type while unmarshalling。但是对于这个项目,我宁愿不使用像 MOXy 这样的外部库。
有谁知道如何以 干净 的方式仅使用 JAXB 来做到这一点?
您可以在事件对象生命周期方法中定义:
void afterUnmarshal(Unmarshaller unm, Object parent) {
localDateTime = ....
};
boolean beforeMarshal(Marshaller mar) {
date = localDateTime.toDate();
....
};
在解组后(使用日期和时间值)构造 LocalDateTime 属性,并在使用当前 LocaLDateTime 值编组之前准备 date/time 字段。 您仍然需要 time/date 字段来匹配 xml 并且 localDateTime 字段必须是 XmlTransient。所以它与 set/getter 方法没有太大区别,但可能更 "clean"。