Simple XML是否支持xsd:dateTime日期格式?

时间:2014-04-29 12:33:46

标签: java xml simple-framework

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"

2 个答案:

答案 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;
}