java - 简单 XML 是否支持 xsd :dateTime date format out of box?

标签 java xml simple-framework

<分区>

除了教程中提到的 2007-01-03 18:05:11.234 GMT 格式之外,Simple XML 是否支持任何日期格式?如果不是,我应该实现自定义 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"

最佳答案

如果您想使用除 SimpleXML 不支持的格式之外的任何其他格式,那么您需要为此做一些工作,您必须编写您的自定义 Transform 来处理其他格式,这不是很多事情要做,真的很简单。

像这样在您的日期字段上放置属性注释

@Attribute(name="date", required=true) 
private Date date;

自定义日期格式转换器

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

关于java - 简单 XML 是否支持 xsd :dateTime date format out of box?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23364797/

相关文章:

javascript - 将多页 html 导出为单个 pdf

java - 使用 SimpleXML 反序列化

java - 使用简单 XML 反序列化时出现未知异常

java - 使用 Java SimpleXml 序列化字符串列表,其中列表中的每个元素都是 XML 中的元素

java - OAuth:App Id 或 redirect_uri 与授权码不匹配

java - 从 Java 6 SE 迁移到 Java 6 EE

java - 使用适用于 Android 的 Quizlet API

java - 以下是什么意思 "checked JMSException converted to unchecked"

javascript - 使用 JavaScript 从 XML 文件搜索并输出数据

python - 在 Python 中,解析自定义 XML 标签而不解析 HTML