【问题标题】:Large number failing validation as type xs:integer大数验证失败,类型为 xs:integer
【发布时间】:2015-04-29 19:39:47
【问题描述】:

如果我尝试验证以下 XML:

 <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
    <SignedInfo>
      <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
      <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
      <Reference URI="#Id-6fa82551-828a-4d41-ab07-02f6887e32a1">
        <Transforms>
          <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
        </Transforms>
        <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
        <DigestValue>YZR2p1r5yr4m5vO3ZiK51UCt0n4=</DigestValue>
      </Reference>
    </SignedInfo>
    <SignatureValue>aPY/qeVV5nNCidTlEfB2uiUdg6UtRwRa2/Eqtmcg89P2RkIYl+n+WJ9LbnleGnLwvn8PDe24cRZqxesIFZEs4hVdzxFpFiMVLNaP4etER/k9fzZmcDS8OxtPgkRst6dS2hf2HJA3B2BCpMMCvSb2UAuTGMZAKFeLdfFZiFgCFm08iGLBQ54xML26f0vaOHLoF5fa0XPMq3OkAKwSHw9/mzpzUFGaaIdzj/qiHKJy5uxLEjMt4/FSu44rEHAxziHnyBo7CYsRK1SvwYUhxDEU+TqBOGvFTUqh8qCWzKkhgURjq5gwWd2qYrV7AXkcs5fXXxBH8w9Mnx7C1GHk05ssNQ==</SignatureValue>
    <KeyInfo>
        <X509Data>
          <X509IssuerSerial>
            <X509IssuerName>CN=sbsp3800jcc.office.sbs</X509IssuerName>
            <X509SerialNumber>153921637767027919309545657592381534070</X509SerialNumber>
          </X509IssuerSerial>
        </X509Data>          
    </KeyInfo>
</Signature>

针对xmldsig-core-schema.xsd 架构(可以在互联网上轻松找到),然后我收到以下验证错误:

Validation of current file using XML schema:


ERROR: Element '{http://www.w3.org/2000/09/xmldsig#}X509SerialNumber': '153921637767027919309545657592381534070' is not a valid value of the atomic type 'xs:integer'.

但是,我在互联网上找到的许多帖子让我相信 xs:integer 类型应该支持无限数量的字符。那么,我的验证是否行为不端?我现在尝试了 2 种不同的验证技术 - 首先是 .NET System.Xml 库 (XmlReader),其次是 Notepad++ 的 XML 插件。两者都失败并显示相同的消息。他们都错了吗?或者,xs:integer 值的大小实际上是否存在限制?

【问题讨论】:

标签: xml xsd xml-dsig


【解决方案1】:

xs:integerxs:decimal 的限制(无小数部分)。 decimal spec

十进制有一个由十进制数字的有限长度序列组成的词法表示

所以理论上对位数没有限制。

但是规范包含一个关于最低限度符合处理器的注释,允许支持少至 18 位。 (您的整数有 39 位数字。)您尝试的处理器似乎只是那些最低限度符合的处理器,而 Xerces 和 Saxon-EE(根据 Daniel Haley 的评论)不是。

虽然规范说此类处理器的位数限制应该明确记录,但似乎它不符合forum post

顺便说一句,您可以通过XML Validator on freeformatter.com 在线验证。它验证您的示例文档。

【讨论】:

  • 感谢您的回复。不过,这让我有点卡在解决方案上。我还在 SO 上找到了另一篇文章,除了更改 xsd 以将字段定义为字符串并执行自定义后模式验证以验证它是否为数字之外,也没有“干净”的解决方案。
  • 在线 xml 验证器通过了 xml - xsd 验证,尽管我的 xs:integer 值为79228162514264337593543950335。但是 xmllint 库会引发错误。
  • 看来,xmllint 只支持 24 或 25 位十进制数字(不包括前导零)。 (我查看了用于XML_SCHEMAS_INTEGERxmlSchemaParseUInt
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多