4

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 或任何其他地方提取的值……等等。

4

2 回答 2

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");
于 2012-09-17T23:29:27.530 回答
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 的一部分。因此,如果您找到另一个更清洁的解决方案,请告诉我们。

于 2012-09-17T22:24:25.283 回答