【问题标题】:Why does the W3C XML Schema specification allow integers to have leading zeros?为什么 W3C XML Schema 规范允许整数有前导零?
【发布时间】:2017-08-23 02:09:55
【问题描述】:

最近我有一个示例,其中 xml 消息中的整数字段包含前导零。不幸的是,这些零点具有相关性。有人可能会争论为什么在模式定义中选择整数。但这不是我的问题。在允许的情况下,我有点惊讶前导零。所以我查了specs,它当然告诉我超类型是decimal。但正如预期的那样,规范并没有真正告诉你为什么做出某些选择。所以我的问题实际上是允许前导零的理由是什么?我的意思是数字通常没有前导零。

顺便说一句,我想对前导零添加限制的唯一方法是通过模式。

【问题讨论】:

    标签: xsd integer w3c specifications


    【解决方案1】:

    我记得 XML Schema 工作组允许在 XSD 小数中使用前导零,因为它们在正常的十进制表示法中是允许的:1、01、001、0001 等在正常的数字表示法中都表示相同的数字。 (但我实际上不记得有什么讨论过,所以也许这只是我认为这是正确的做法,其他 WG 成员有其他理由对此感到满意的原因。)

    您认为问题的根源是使用 xsd:integer 作为符号类型是正确的,该符号使用前导零很重要的数字字符串(例如在美国邮政编码中);我认为你可能过于慷慨地说有人可能会争论那个决定。可以提出哪些可能的论据来支持这种明显错误的选择?

    【讨论】:

    • 我同意你的小数,但整数是一个子类型。它是一个更窄的,禁止小数点。我不明白你的第二点。你是说当前导零相关时使用 xs:integer 没有任何论据?
    • 是的,差不多:如果前导零是相关的,这几乎总是表明该值是一个仅由十进制数字组成的字符串,并且不适用正常的算术运算。将两个邮政编码相乘意味着什么?添加它们?比较它们以确定哪个值更大?所有明确表明美国邮政编码是受限制字母表上的字符串,而不是整数。
    • 感谢您的回答。虽然我仍然觉得它有点奇怪。但我想它就是这样。
    【解决方案2】:

    虽然数字通常没有前导零,但解析数字几乎总是允许前导零。

    您不想完全禁止数字的前导零,因为您希望可以选择编写像0.12 这样的数字,而不仅仅是像.12。由于您希望浮点数至少允许一个前导零,因此只允许一个前导零并且仅用于浮点数会感觉有点限制。

    有时数字确实有前导零,例如 ISO8601 格式的日期中的组件; 2014-05-02。如果你想解析一个组件,如果允许前导零是很方便的,这样你就不必在解析之前编写额外的代码来删除它。

    XML 规范只是使用通常用于大多数格式和大多数编程语言的相同规则集来解析数字。

    【讨论】:

    • 我同意你关于小数的问题。但是整数是十进制的子类型。根据定义,唯一以零开头的整数本身就是零。您对符合解析器的问题有意见。虽然对于整数,我看不出指定比解析器可以处理的更窄的问题。
    • @pjanssen:这会使解析规则不一致,例如01 是一个有效的浮点数,但不是一个有效的整数值。
    • 但是难道不能期望 xs:integer 字段只包含整数而不包含小数/浮点数。虽然这可能是我在这件事上缺乏教育。
    • @pjanssen:XML 格式旨在可以手动读取和编辑,因此解析规则不是尽可能严格。例如,当符号为正时,该符号是可选的,因此您可以将数字写为42,而不必将其写为+42
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    相关资源
    最近更新 更多