正则表达式或库用于验证内置XSD类型?

时间:2012-09-17 15:03:43

标签: java xml regex xsd

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或任何其他位置提取的值......等等。

2 个答案:

答案 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的一部分。因此,如果您找到另一个更清洁的解决方案,请告诉我们。