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或任何其他位置提取的值......等等。
答案 0 :(得分:2)
以下是您可能使用的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");
答案 1 :(得分:1)
这是一个使用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的一部分。因此,如果您找到另一个更清洁的解决方案,请告诉我们。