XML Schema规范定义了许多内置数据类型http://www.w3.org/TR/xmlschema-2/#built-in-datatypes,那里有Java库可以回答有关天气的问题,值是一种特定的数据类型。沿线的东西。
if(XSDValidator.isXSDDate("2012-06-12") == false) {
// return error
}
更新:此用例不是在XML上下文中,而是在我有一个要符合一种XSD类型的字符串并且想要一种标准方式来检查其符合性的情况下。例如,字符串可以是我从传入的JSON请求中提取的值,也可以是从URL或任何其他位置提取的值,等等。
以下是您可能会使用的JDK / JRE中的一些可用类:
javax.xml.datatype.XMLGregorianCalendar
对于日期/时间类型,您可以使用javax.xml.datatype.XMLGregorianCalendar
,它自Java SE 5起就包含在JDK / JRE中。
DatatypeFactory df = DatatypeFactory.newInstance();
XMLGregorianCalendar xgc = df.newXMLGregorianCalendar("2012-06-18");
return DatatypeConstants.DATE.equals(xgc.getXMLSchemaType());
javax.xml.bind.DatatypeConveter
还有javax.xml.bind.DatatypeConveter
会为错误的值抛出IllegalArgumentException
:
DatatypeConverter.parseDate("2012-06-18");
这里是使用Xerces解析器/验证器的解决方案。但是,它使用.impl
类。这些不是公共API的一部分,可能会随时更改。但是,如果您坚持使用某个版本,就可以了。
首先,依赖项:
<dependency>
<groupId>xerces</groupId>
<artifactId>xerces</artifactId>
<version>2.4.0</version>
</dependency>
这是一个像您描述的一样工作的小程序:
import org.apache.xerces.impl.dv.InvalidDatatypeValueException;
import org.apache.xerces.impl.dv.xs.DateDV;
public class XSDValidator {
public static void main(final String[] args) {
System.out.println(isXSDDate("2012-09-18"));
System.out.println(isXSDDate("Hello World"));
}
private static boolean isXSDDate(final String string) {
try {
new DateDV().getActualValue(string);
return true;
} catch(final InvalidDatatypeValueException e) {
return false;
}
}
}
输出:
true
false
您要做的就是为每种数据类型创建方法。您应该能够在org.apache.xerces.impl.dv.xs包中找到所有必需的类。
同样,这是在滥用Xerces库,因为这些类不是公共API的一部分。因此,如果您找到另一个更清洁的解决方案,请告诉我们。