我使用的是W3C XML Schema(不是我编写的)。一个工具,xmllint, 拒绝使用架构:
traceroute.xsd:658: element element: Schemas parser error : Element
'{http://www.w3.org/2001/XMLSchema}element', attribute 'maxOccurs': The value
'4294967295' is not valid. Expected is '(xs:nonNegativeInteger | unbounded)'.
4294967295是2 ^ 32-1所以很明显,xmllint实现了整数 签署了32位数,这还不够。
xmllint对吗?该标准显然不限制其大小 整数:
http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/structures.html#p-max_occurs http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/datatypes.html#nonNegativeInteger
nonNegativeInteger的值空间 是无限集{0,1,2,...}。
因此,实现者应该使用无限整数......
最佳做法是什么?
实施者应该使用bigints或类似的东西吗? (在这种情况下, xmllint错了。)
架构作者是否应将自己限制为“合理”值 maxOccurs的? (在这种情况下,我会将问题报告给架构 作者。)
答案 0 :(得分:4)
虽然可能是maxOccurs
属性的“技术上”正确用法,但这种用法不是(IMO)如何使用maxOccurs
。
模式编写器看起来意味着此元素可能会出现任意次,在这种情况下,定义的正确值将为unbounded
。
当前定义所暗示的是,使用此模式的系统对于最多4294967295
的元素计数将表现得非常正确,但对于任何更大的元素都会失败。
我认为这是一个有意义的技术要求 - 许多系统将int32
编码为最大元素数,因此在理想世界中您可能希望强制执行此限制,但我不这样做认为在现实世界中尝试捕获模式确实是一个合理或有用的东西。
另外,如果要发送那么多元素,那么XML可能是错误的数据格式。
我建议架构作者使用unbounded
属性值,或者使用实际上与使用此XML的系统的限制和要求相匹配的值。
答案 1 :(得分:1)
最后,架构已被其作者修改。它已在RFC 5388发布,现在包含:
<xs:element maxOccurs="2147483647" minOccurs="0"
name="Measurement">
<xs:complexType>
<xs:sequence>
答案 2 :(得分:1)
maxOccurs的最大值为4095。
如果需要更多,请将其设置为“ unbounded”。
参考:
https://docs.microsoft.com/en-us/biztalk/core/technical-reference/max-occurs-node-property-of-all-schemas
希望获得帮助!