prev | table of contents | next |
JAXB binds all three of the schema types xsd:date
,
xsd:time
and xsd:dateTime
to
XMLGregorianCalendar
. This class is in the package
javax.xml.datatype
. (Do not confuse this with
java.util.GregorianCalendar
.) There is a convenient
set of methods for getting at the various components such as year or day
or minute. But creating any of these values isn't quite so
simple because XMLGregorianCalendar
is an abstract
class. We'll illustrate this with a simple example for marshalling
date and time.
The XML schema snippet shown below defines an element containing
sub-elements with xsd:date
and xsd:time
.
<xsd:complexType name="DateTimeType"> <xsd:sequence> <xsd:element name="Date" type="xsd:date"/> <xsd:element name="Time" type="xsd:time"/> </xsd:sequence> </xsd:complexType>The generated class contains the usual getters and setters:
public class DateTimeType { protected XMLGregorianCalendar date; protected XMLGregorianCalendar time; public XMLGregorianCalendar getDate() { return date; } public void setDate(XMLGregorianCalendar value) { this.date = value; } public XMLGregorianCalendar getTime() { return time; } public void setTime(XMLGregorianCalendar value) { this.time = value; } }However, some work remains to be done before we can call either setter. It's The class
DatatypeFactory
that provides the methods
with which we can create the XMLGregorianCalendar
objects.
// Create a DateTimeType element for the current time and date. ObjectFactory of = new ObjectFactory(); DateTimeType meta = of.createDateTimeType(); GregorianCalendar now = new GregorianCalendar(); // Obtain a DatatypeFactory instance. DatatypeFactory df = DatatypeFactory.newInstance(); // Create an XMLGregorianCalendar with the current date. XMLGregorianCalendar gcDate = df.newXMLGregorianCalendarDate( now.get( Calendar.YEAR ), now.get( Calendar.MONTH ), now.get( Calendar.DAY_OF_MONTH ), DatatypeConstants.FIELD_UNDEFINED ); // Create an XMLGregorianCalendar with the current time. XMLGregorianCalendar gcTime = df.newXMLGregorianCalendarTime( now.get( Calendar.HOUR_OF_DAY ), now.get( Calendar.MINUTE ), now.get( Calendar.SECOND ), null, // no fraction DatatypeConstants.FIELD_UNDEFINED ); // Insert sub-elements into the DateTimeType element. meta.setDate( gcDate ); meta.setTime( gcTime );You may have noticed the
null
argument in the method
constructing an XMLGregorianCalendar
with the time.
This indicates that we don't care about fractions of seconds. It is,
however, not possible to omit seconds entirely.
The XML element produced by this code will look like this:
<DateTime> <Date>2008-07-23</Date> <Time>18:42:24</Time> </DateTime>You should notice that the date and time representations follow ISO 8601.
prev | table of contents | next |