【问题标题】:Validate custom date and time in XML with XSD使用 XSD 验证 XML 中的自定义日期和时间
【发布时间】:2015-02-09 13:20:24
【问题描述】:

我必须验证格式为 09.02.2015 (DD.MM.YYYY) 和时间 14:05 (HH:MM) 的日期,但找不到执行此操作的方法。

这是一个例子:

XML:

<?xml version="1.0"?>
<root>
    <testdate>09.02.2015</testdate>
    <testtime>14:05</testtime>
</root>

XSD:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
    <!-- Root element -->
    <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>

    <!-- Date format used to validate dates formatted like 01.01.2015 -->
    <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>

    <!-- Time format used to validate times formatted like 11:55, 23:59 etc. -->
    <xs:simpleType name="zstime">
        <xs:restriction base="xs:time">
            <xs:pattern value="^(0[0-9]|[1][0-9]|2[1-3]):([0-5][1-9])$"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

我尝试使用 notepad++ XML 插件和 XML validator 验证 XML。

记事本++输出:

使用 XML 模式验证当前文件:

错误:元素“testdate”:“09.02.2015”不是原子类型“zsdate”的有效值。
错误:元素“testtime”:“14:05”不是 原子类型“zstime”的有效值。

使用Regular Expression Tester 测试正则表达式时,它匹配正确。
我尝试将类型从xs:datexs:time更改为xs:string,但验证结果是一样的。

知道我做错了什么吗?

【问题讨论】:

  • 以上时间模式不包括20小时00分。

标签: xml validation xsd


【解决方案1】:

您的日期和时间要求不受xs:datexs:time 的适当限制。如果是这样,进行这些更改会起作用(但不会像您希望的那样严格):

                <xs:element name="testdate" type="xs:date"/>
                <xs:element name="testtime" type="xs:time"/>

因此,要使用您的模式,您必须以xs:string 为基础。您还必须考虑到,在 XSD 的 xs:pattern 正则表达式中,在模式的开头已经有一个隐式的 ^ 锚点,而在模式的末尾已经有一个 $ 锚点。删除您添加的额外内容可以消除您遇到的问题。

XSD

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
    <!-- Root element -->
    <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>

    <!-- Date format used to validate dates formatted like 01.01.2015 -->
    <xs:simpleType name="zsdate">
        <xs:restriction base="xs:string">
            <xs:pattern value="(0[1-9]|[12][0-9]|3[01]).(0[1-9]|1[012]).(19|20)\d\d"/>
        </xs:restriction>
    </xs:simpleType>

    <!-- Time format used to validate times formatted like 11:55, 23:59 etc. -->
    <xs:simpleType name="zstime">
        <xs:restriction base="xs:string">
            <xs:pattern value="(0[0-9]|[1][0-9]|2[1-3]):([0-5][1-9])"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

【讨论】:

  • 谢谢!我不知道隐含的^$
【解决方案2】:

最好这样,验证 HH:50:

<xs:pattern value="(0[0-9]|[1][0-9]|2[1-3]):([0-5][0-9])"/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多