大量失败验证类型 xs:integer
Large number failing validation as type xs:integer
如果我尝试验证以下 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 类型应该支持无限数量的字符。那么,我的验证行为不当吗?我现在尝试了两种不同的验证技术——首先是 .NET System.Xml 库 (XmlReader),其次是 Notepad++ 的 XML 插件。两者都失败并显示相同的消息。他们都错了吗?或者,xs:integer 值的大小实际上有限制吗?
xs:integer
是 xs:decimal
的限制(没有小数部分)。 decimal spec 说
decimal has a lexical representation consisting of a finite-length sequence of decimal digits
所以理论上是没有位数限制的
但 规范包含一条关于最低限度符合要求的处理器 的说明,这些处理器允许支持少至 18 位数字。 (您的整数有 39 位数字。)您尝试的处理器似乎只是最低限度符合要求的处理器,而 Xerces 和 Saxon-EE(根据 Daniel Haley 的评论)则不是。
尽管规范说应该明确记录此类处理器的位数限制,但似乎并非如此forum post。
顺便说一句,您可以通过 XML Validator on freeformatter.com 在线验证。它验证您的示例文档。
如果我尝试验证以下 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 类型应该支持无限数量的字符。那么,我的验证行为不当吗?我现在尝试了两种不同的验证技术——首先是 .NET System.Xml 库 (XmlReader),其次是 Notepad++ 的 XML 插件。两者都失败并显示相同的消息。他们都错了吗?或者,xs:integer 值的大小实际上有限制吗?
xs:integer
是 xs:decimal
的限制(没有小数部分)。 decimal spec 说
decimal has a lexical representation consisting of a finite-length sequence of decimal digits
所以理论上是没有位数限制的
但 规范包含一条关于最低限度符合要求的处理器 的说明,这些处理器允许支持少至 18 位数字。 (您的整数有 39 位数字。)您尝试的处理器似乎只是最低限度符合要求的处理器,而 Xerces 和 Saxon-EE(根据 Daniel Haley 的评论)则不是。
尽管规范说应该明确记录此类处理器的位数限制,但似乎并非如此forum post。
顺便说一句,您可以通过 XML Validator on freeformatter.com 在线验证。它验证您的示例文档。