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

问题描述 投票:4回答:2

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

java xml regex xsd
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");

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

© www.soinside.com 2019 - 2024. All rights reserved.