簡體   English   中英

XSD 架構:xs:maxLength 的邊界/數據類型,用於簡單數據類型限制

[英]XSD Schema: Boudaries / data-type for xs:maxLength for simple data-type restrictions

我目前正在使用我不是作者/無法控制的 xsd 架構。 在模式中有一個定義為受限字符串的數據類型:

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:minLength value="1" />
    <xs:maxLength value="9999999999999999" />
  </xs:restriction>
</xs:simpleType>

處理此問題時,我在 .net 中遇到運行時錯誤,這是由 maxLength 屬性超出 32 位整數范圍引起的。 所以現在我想弄清楚這是否實際上是一個有效的 xsd 架構。

我曾嘗試搜索有關 xs:maxLength 屬性允許的數據類型的文檔,但搜索結果很短。

https://www.w3.org/TR/xmlschema-2/#rf-maxLength的官方規范說:

[定義:] maxLength 是長度單位的最大數量,其中長度單位根據正在導出的類型而變化。 maxLength 的值·必須·是一個非負整數。

對於 nonNegativeInteger,它在https://www.w3.org/TR/xmlschema-2/#nonNegativeInteger中說:

定義:] nonNegativeInteger 是通過將·minInclusive· 的值設置為0 從整數·派生·得出的。這導致了非負整數的標准數學概念。 nonNegativeInteger 的·值空間·是無限集合{0,1,2,...}。 nonNegativeInteger 的·基本類型·是整數。

3.3.20.1 詞法表示 nonNegativeInteger 有一個詞法表示,由一個可選符號和后跟有限長度的十進制數字序列 (#x30-#x39) 組成。 如果省略符號,則假定為正號 ("+")。 如果存在符號,則它必須是“+”,但表示零的詞匯形式除外,其前面可能帶有正號 (“+”) 或負號 (“-”)。 例如:1、0、12678967543233、+100000。

基於此,我看不到對值空間的任何限制,作為一個無限集,它允許任何非負整數。

因此我認為模式本身是有效的。

這顯然無助於任何模式驗證器實現最終將通過選擇編程語言或平台中的數據類型來表示值來施加的約束。

XSD 1.1 指定(在第 2 部分,§5.4):所有·最低標准·處理器必須支持十進制值,其絕對值可以表示為 i / 10k,其中 i 和 k 是非負整數,使得 i < 1016 且 k ≤ 16(即,那些可以用總共 16 個數字表示的)。

所以這個 16 位整數是有效的。

它還說:對於其他無限類型,如字符串、hexBinary 和 base64Binary,沒有指定最小實現限制。

我對此的解釋是允許處理器對字符串的長度施加限制,並且規范沒有對該長度規定任何限制。 實際上,我懷疑大多數實現(尤其是 20 年前編寫的實現)不太可能允許長度超過 2^31 個字符的字符串。

我認為如果模式指定的 maxLength 大於實現定義的限制,它將被忽略是明智的; 但是規范中沒有任何內容可以明確說明。

Microsoft 處理器實現了 XSD 1.0,據我所知,它根本沒有提到任何限制。 這是早期 W3C 規范的傳統:例如,XML 規范對元素和屬性名稱的長度限制只字不提。 實際上,所有加工商都會施加某種限制,很難說這會導致它們不合規。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM