您的位置:首页 > 其它

JAXB - XML Schema Types, Date and Time

2016-05-18 13:16 381 查看
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
javax.xml.datatype.DatatypeFactory
that provides the methods with which we can create the
javax.xml.datatype.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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: