在Java语言中解析XML的最佳方法是什么?合法的dateTime值包括2002-10-10T12:00:00-05:00和2002-10-10T17:00:00Z
有没有好的开源库可以使用,或者我是否应该使用SimpleDateFormat或类似的工具来开发自己的开源库?
发布于 2011-04-20 23:20:08
还有javax.xml.bind.DatatypeConverter#parseDateTime(String xsdDateTime),它是JDK的一部分。
发布于 2009-05-26 06:17:38
我想你想要Joda Time的ISODateTimeFormat.dateTimeNoMillis()。总的来说,我强烈建议您远离Java中内置的Date/Calendar类。Joda Time的设计要好得多,它支持不可变性(特别是格式器是不可变的,并且是线程安全的),并且是Java7中新的日期/时间API的基础。
示例代码:
import org.joda.time.*;
import org.joda.time.format.*;
class Test
{
public static void main(String[] args)
{
parse("2002-10-10T12:00:00-05:00");
parse("2002-10-10T17:00:00Z");
}
private static final DateTimeFormatter XML_DATE_TIME_FORMAT =
ISODateTimeFormat.dateTimeNoMillis();
private static final DateTimeFormatter CHECKING_FORMAT =
ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC);
static void parse(String text)
{
System.out.println("Parsing: " + text);
DateTime dt = XML_DATE_TIME_FORMAT.parseDateTime(text);
System.out.println("Parsed to: " + CHECKING_FORMAT.print(dt));
}
}输出:
Parsing: 2002-10-10T12:00:00-05:00
Parsed to: 2002-10-10T17:00:00.000Z
Parsing: 2002-10-10T17:00:00Z
Parsed to: 2002-10-10T17:00:00.000Z(请注意,在输出中,两者都以相同的UTC时间结束。格式化后的输出使用UTC,因为我们在withZone调用中要求它使用UTC。)
发布于 2009-05-26 14:48:10
StaxMan是绝对正确的。为了使用SimpleDateFormat,您需要关闭每个SimpleDateFormat中的松散解析,并迭代几种SimpleDateFormat格式,直到找到解析日期而不抛出异常的格式。如果您让松散的解析处于开启状态,那么当您并不真正想要一个匹配时,很容易得到一个匹配,并且lexical space of XSD:DateTime在格式上留下了一些SimpleDateFormat不能在单个表达式中处理的灵活性。
XML Schema 1.0确实使用了ISO 8601,Joda Time按照Jon Skeet的建议实现了ISO 8601,因此这是一个有效的选项。
如果希望将其全部保存在原生Java包中,还可以结合使用XMLGregorianCalendar和DatatypeFactory来解析和创建XSD:Datetime字符串。
请参阅DatatypeFactory.newXMLGregorianCalendar和XMLGregorianCalendar.toXMLFormat
https://stackoverflow.com/questions/909022
复制相似问题