3

是否有针对任何标准 xml 模式数据类型验证字符串的标准方法(请参阅XML 模式第 2 部分:数据类型第二版或更具体地说是内置数据类型)?

我不想验证一个完整的 XSD,我只是想验证一些针对 XML 数据类型的用户输入(例如针对http://www.w3.org/2001/XMLSchema#datehttp://www.w3.org /2001/XMLSchema#boolean)。有没有办法使用标准 API 来做到这一点?如果没有,是否有其他可能性而不是从头开始编写?

javax.xml.validation 包中的类似乎旨在验证完整的模式而不是特定的数据类型。

我正在尝试做的示例:

String content = "abc";
String datatype = "http://www.w3.org/2001/XMLSchema#long";
boolean isValid = Validator.isValid(content, datatype); //return false
4

2 回答 2

1

不是标准 API,但 Xerces 有一个可能感兴趣的XML 架构 API 。在 Xerces 中,您还可以找到使您能够执行此操作的数据类型验证器:

import org.apache.xerces.impl.dv.InvalidDatatypeValueException;
import org.apache.xerces.impl.dv.xs.YearDV;

public class Main {

public static void main(String[] args)  {
    try {
        new YearDV().getActualValue("Notayear", null);
        System.out.println("OK");
    } catch (InvalidDatatypeValueException e) {
        System.out.println(e.getMessage());
    }
}

这将打印

cvc-datatype-valid.1.2.1: 'Notayear' is not a valid value for 'gYear'.

从那里拿走它。大量代码要阅读!

于 2013-04-02T13:51:26.220 回答
0

您可以执行以下操作:

public boolean validate(String inputXml, String schemaLocation)throws SaxException, throws IOException {
// build the schema
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
File schemaFile = new File(schemaLocation);
Schema schema = factory.newSchema(schemaFile);
Validator validator = schema.newValidator();

// create a source from a string
Source source = new StreamSource(new StringReader(inputXml));

// check input
boolean isValid = true;
try {
validator.validate(source);
} catch (SaxException e) {
System.err.printlin("Not valid");
isValid = false;
}

return isValid;
}
于 2013-04-02T13:24:31.320 回答