Simple XML是否支持除教程中提到的格式2007-01-03 18:05:11.234 GMT
之外的任何日期格式?如果没有,我应该实现自定义Transformer
,还是有更简单的解决方案?
我为xsd:dateTime解析创建了一个测试用例,目前失败了:
import org.junit.Test;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import static org.junit.Assert.assertEquals;
public class XsdDateTimeSimpleXmlTest {
String DUMMY_XML = "<dummy><date>2011-12-01T11:46:52</date></dummy>";
@Test
public void testDateTimeDeserialization() throws Exception {
Dummy expected = new Dummy(expectedDate());
Dummy actual = deserialize(DUMMY_XML);
assertEquals(expected, actual);
}
Date expectedDate() {
Calendar c = Calendar.getInstance();
c.set(2011, 12-1, 1, 11, 46, 52);
c.set(Calendar.MILLISECOND, 0);
c.setTimeZone(TimeZone.getTimeZone("UTC"));
return c.getTime();
}
Dummy deserialize(String xml) throws Exception {
Deserializer<Dummy> des = new Deserializer<Dummy>(Dummy.class);
return des.read(xml);
}
@Root
static class Dummy {
@Element
Date date;
Dummy() { }
Dummy(Date date) {
this.date = date;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Dummy dummy = (Dummy) o;
if (!date.equals(dummy.date)) return false;
return true;
}
@Override
public int hashCode() {
return date.hashCode();
}
@Override
public String toString() {
return "Dummy{" +
"date=" + date +
'}';
}
}
}
我得到java.text.ParseException: Unparseable date: "2011-12-01T11:46:52"
。
答案 0 :(得分:3)
如果你想使用除SimpleXML不支持的格式以外的任何其他格式,那么你需要为此做很少的工作,你必须编写自定义的Transform,它将处理其他格式,而不是做得很多,真的很简单。
将属性注释放在日期字段上,如下所示
@Attribute(name="date", required=true)
private Date date;
CustomDateFormatTransformer
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.simpleframework.xml.transform.Transform;
public class CustomDateFormatTransformer implements Transform<Date> {
private DateFormat df;
public DateFormatTransformer(DateFormat df) {
this.df= df;
}
@Override
public Date read(String value) throws Exception {
return df.parse(value);
}
@Override
public String write(Date value) throws Exception {
return df.format(value);
}
}
所有事情都准备好了,最后你可以通过以下客户代码来调用它
DateFormat dateFormat = new SimpleDateFormat("Your_date_format_here");
RegistryMatcher registryMatcher = new RegistryMatcher();
registryMatcher .bind(Date.class, new DateFormatTransformer(dateFormat));
// serialize or Deserializer it here .....
以下是仅由SimpleXML支持的一些格式
yyyy-MM-dd HH:mm:ss.S z, yyyy-MM-dd HH:mm:ss z
yyyy-MM-dd z, yyyy-MM-dd
答案 1 :(得分:0)
我不熟悉上面的框架,但为什么不使用JAXB? JAXB以您希望的方式支持Date。 1.您使用JAXB注释,特别是在日期的getter上,您可以使用:
@XmlElement(type=Date.class)
Date Object getDate() {
return date;
}