无法针对XSD验证日期

时间:2016-02-02 09:21:52

标签: java xml xsd saxparser xml-validation

我正在尝试针对定义的XSD实现XML的基本验证 XML:

<Employee type="permanent">
    <Name>John</Name>
    <employeeId>9000</employeeId>
    <Age>28</Age>
    <dateOfBirth>28/12/2000</dateOfBirth>
    <city>Vancouver</city>
    <salary>120000</salary>
</Employee>

XSD:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Employee">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Name" type="xs:string"></xs:element>
                <xs:element name="employeeId" type="xs:int"></xs:element>
                <xs:element name="Age" type="xs:int"></xs:element>
                <xs:element name="dateOfBirth" type="xs:date"></xs:element>
                <xs:element name="city" type="xs:string"></xs:element>
                <xs:element name="salary" type="xs:int"></xs:element>
            </xs:sequence>
            <xs:attribute name="type" type="xs:string"></xs:attribute>
        </xs:complexType>
    </xs:element>
</xs:schema>

但是当我运行验证器时:

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema schema = factory.newSchema(new File(schemaPath));
            Validator validator = schema.newValidator();
            validator.setErrorHandler(new BasicErrorHandler());
            validator.validate(new StreamSource(new File(xmlPath)));

我一直收到以下错误:

cvc-datatype-valid.1.2.1: '12/28/2000' is not a valid value for 'date'.
cvc-type.3.1.3: The value '12/28/2000' of element 'dateOfBirth' is not valid.

现在,当我尝试在SO和Google上搜索解决方案时,我发现了这一点:

<xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="testdate" type="zsdate"/>
                <xs:element name="testtime" type="zstime"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:simpleType name="zsdate">
        <xs:restriction base="xs:date">
            <xs:pattern value="^(0[1-9]|[12][0-9]|3[01]).(0[1-9]|1[012]).(19|20)\d\d$"/>
        </xs:restriction>
    </xs:simpleType>

我不想将数据类型转换为字符串并针对正则表达式进行验证。我的日期将始终采用dd / mm / yyyy格式。它是用上面粘贴的XML编写的。

我有什么遗失的东西吗?

P.S。当我使用以下内容时:

   <dateOfBirth>2012-08-22</dateOfBirth>

它工作正常。

1 个答案:

答案 0 :(得分:2)

<xs:date>必须采用YYYY-MM-DD格式。所以要么你这样写,要么你用正则表达式<xs:string>