【问题标题】:XML / XSD ISODateTime What is the correct format?XML/XSD ISODateTime 正确的格式是什么?
【发布时间】:2019-09-27 18:24:12
【问题描述】:

我正在处理一些要求日期为“ISODateTime”格式的旧 XML/XSD 代码。我尝试了许多不同的 ISO 日期/时间格式,即中间有“T”,但验证仍然失败。

我是否遗漏了一些明显的东西?下面是 XML 和 XSD sn-ps 以及错误消息。

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 -->

验证错误:

错误:元素 '{urn:iso:std:iso:20022:tech:xsd:tsmt.017.001.03}Credit': '2019-09-27 04:00:00' 不是原子类型“{urn:iso:std:iso:20022:tech:xsd:tsmt.017.001.03}ISODateTime”。

【问题讨论】:

  • 我修正了结束标签名称中的错字。

标签: xml xsd xsd-validation isodate


【解决方案1】:

从错误信息来看,类型ISODateTime在命名空间urn: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 类型施加一些限制,例如,它可以强制使用小数秒或时区,或者限制允许的年份范围。

但是,您引用的验证错误是因为值的日期和时间部分之间有空格而不是“T”。

【讨论】:

  • 我最初尝试使用“T”,但日期中的引号引发了错误。删除引号并使用纯 T 为我解决了它。非常感谢!
【解决方案2】:

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

我没有找到ISODateTime 的定义,但在W3.org is a definition for date/time formats 找到了最接近的定义是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。

【讨论】:

    【解决方案3】:

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

    它只是 xsd:dateTime 的一个子类型,具有上述定义中提到的限制。请注意 xsd:dateTime 中不存在的围绕诸如开始和结束之类的事情的额外定义。注意明确时间偏移的要求。这些是 xsd:dateTime 的细微变化。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多