XML / XSD ISODateTime 正确的格式是什么?

XML / XSD ISODateTime What is the correct format?

我正在使用一些旧的 XML/XSD 代码,这些代码要求日期采用 'ISODateTime' 格式。我尝试了多种不同的 ISO date/time 格式,即中间有 'T',但验证仍然失败。

我是不是遗漏了什么明显的东西?下面是 XML 和 XSD 片段以及错误消息。

XSD:

<xs:complexType name="MessageId">
    <xs:sequence>
        <xs:element name="Id" type="Max35Text"/>
        <xs:element name="Credit" type="ISODateTime"/>
    </xs:sequence>
</xs:complexType>

XML:

<ParentId>
    <Id>unique id</Id>
    <Credit>2019-09-27 04:00:00</Credit>
</ParentId>   <!-- Fixed by edit -->

验证错误:

ERROR: Element '{urn:iso:std:iso:20022:tech:xsd:tsmt.017.001.03}Credit': '2019-09-27 04:00:00' is not a valid value of the atomic type '{urn:iso:std:iso:20022:tech:xsd:tsmt.017.001.03}ISODateTime'.

我可以通过将您的日期格式从命名空间 http://www.w3.org/2001/XMLSchema 更改为 xs:dateTime 来让您的 XSD 工作,在您的示例中是 2019-09-27T04:00:00

我没有找到 ISODateTime 的定义,但在 W3.org is a definition for date/time formats and the closest I found was xs:dateTime described here

因此,将您的 XML 更改为(只需添加您提到的 "T")

<?xml version="1.0" encoding="UTF-8"?>
<ParentId>
    <Id>unique id</Id>
    <Credit>2019-09-27T04:00:00</Credit>
</ParentId>

和这个示例 XSD

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:complexType name="MessageId">
        <xs:sequence>
            <xs:element name="Id" type="xs:string"/>   <!-- Changed for simplicity -->
            <xs:element name="Credit" type="xs:dateTime"/>
        </xs:sequence>
    </xs:complexType>

    <xs:element name="ParentId" type="MessageId" />

</xs:schema>

将验证您的 XML。

从报错信息来看,类型ISODateTime在namespaceurn:iso:std:iso:20022:tech:xsd:tsmt.017.001.03中。 ISO 20022 是金融行业使用的一套标准。我不熟悉它,但我在 https://tools20022.com/apidocs/com/tools20022/repository/dict/datatype/ISODateTime.html

找到了这种数据类型的描述

该页面实际上没有给出类型的 XSD 定义,从描述中我看不出与标准 W3C 类型 xs:dateTime 有任何区别。然而,它值得对实际模式进行一些进一步的研究。它可能会对 W3C 类型施加一些限制,例如,它可能会强制使用小数秒或时区或限制允许的年份范围。

但是,您引用的验证错误是因为您在值的日期和时间部分之间有 space 而不是 "T"。

ISODateTime 定义于 https://www.iso20022.org/standardsrepository/type/ISODateTime

它只是 xsd:dateTime 的一个子类型,具有上述定义中注明的限制。请注意有关一天开始和结束等事物的额外定义,这些定义在 xsd:dateTime 中不存在。请注意显式时间偏移的要求。这些是 xsd:dateTime.

的细微变化

XML 模式不强制执行此操作,这就是为什么当您编写带有“T”的有效 xsd:dateTime 时它起作用的原因。