2

我在 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 的“合理”值?(在这种情况下,我会将问题报告给架构作者。)

4

3 回答 3

4

虽然可能是该maxOccurs属性的“技术上”正确用法,但这种用法不是(IMO)maxOccurs打算如何使用的。

看起来模式编写者的意思是该元素可能出现任意多次,在这种情况下,定义的正确值将是unbounded.

当前定义的含义是,使用此模式的系统对于元素计数将完全正确,4294967295但对于更大的元素将失败。

我想这是一个可能有意义的技术要求 - 许多系统将int32编码为元素的最大数量,因此在理想世界中您可能想要强制执行此限制,但我认为这不是一个合理或有用的在现实世界的模式中尝试和捕获的东西。

此外,如果您要发送这么多元素,那么 XML 可能是错误的数据格式。

我建议架构作者使用unbounded属性值,或者使用实际匹配使用此 XML 的系统的限制和要求的值。

于 2008-11-18T21:48:27.777 回答
2

最后,该模式已被其作者修改。它已在RFC 5388中发布,现在包含:

     <xs:element maxOccurs="2147483647" minOccurs="0"
                 name="Measurement">
       <xs:complexType>
         <xs:sequence>
于 2008-12-11T20:38:48.407 回答
1

maxOccurs 的最大值是 4095。
如果需要更多,请将其设置为“无界”。
参考: https ://docs.microsoft.com/en-us/biztalk/core/technical-reference/max-occurs-node-property-of-all-schemas

希望这有帮助!

于 2019-09-20T08:48:27.910 回答