推斷簡單型別的規則
說明 XmlSchemaInference 類別如何推斷屬性和項目的資料型別。
XmlSchemaInference 類別會將屬性和項目的資料型別推斷為簡單型別。 本節將說明可能的推斷型別、多種不同的值如何調節為單一型別,以及如何處理結構描述定義的 xsi
屬性。
推斷的型別
XmlSchemaInference 類別會將項目和屬性值推斷為簡單型別,並在產生的結構描述內包含型別屬性。 所有推斷的型別皆為簡單型別。 基底型別或 Facet 都不會納入結果結構描述中。
在 XML 文件中發現的值會個別進行檢查。 對某個值進行檢查時,即會推斷其型別。 若在推斷屬性或項目的型別後,發現該屬性或項目的值不符合目前推斷的型別,XmlSchemaInference 類別就會針對每組規則提升型別。 這些規則將在本主題稍後的<型別提升>一節中討論。
下列表格列出可能出現在結果結構描述中的推斷型別。
簡單型別 | 描述 |
---|---|
boolean | True、False、0、1。 |
byte | 介於 -128 與 127 之間的整數。 |
unsignedByte | 介於 0 與 255 之間的整數。 |
short | 介於 -32768 與 32767 之間的整數。 |
unsignedShort | 介於 0 與 65535 之間的整數。 |
int | 介於 -2147483648 與 2147483647 之間的整數。 |
unsignedInt | 介於 0 與 4294967295 之間的整數。 |
long | 介於 -9223372036854775808 與 9223372036854775807 之間的整數。 |
unsignedLong | 介於 0 與 18446744073709551615 之間的整數。 |
整數 | 可能會以 "-" 開頭的有限數值。 |
decimal | 含有 0 至 28 位精準度的數值。 |
float | 其後可以為 "E" 或 "e" 的十進位數,最後再接上代表指數的整數值。 十進位值可介於 -16777216 與 16777216 之間。 指數值可介於 –149 與 104 之間。 浮點數允許用特殊的值代表無限值與非數字值。 浮點數的特殊值包括:0, -0, INF, -INF, NaN。 |
double | 與浮點數相同,不同之處在於十進位值可介於 -9007199254740992 與 9007199254740992 之間,而指數值可介於 –1075 與 970 之間。 雙精度浮點數允許用特殊的值代表無限值與非數字值。 浮點數的特殊值包括:0, -0, INF, -INF, NaN。 |
duration | W3C 期間格式。 |
dateTime | W3C 日期時間格式。 |
time | W3C 時間格式。 |
date | 年份值限定於 0001 與 9999 之間。 |
gYearMonth | W3C 的西曆月份與年份格式。 |
string | 一或多個 Unicode 字元。 |
類型提升
XmlSchemaInference 類別會逐一檢查屬性與項目的值。 若發現任何值,就會推斷最嚴格且不帶正負號的型別。 若在推斷屬性或項目的型別後,發現新的值不符合目前推斷的型別,則推斷的型別會提升為目前推斷型別與新值均適用的新型別。 XmlSchemaInference 類別在提升推斷的型別時,會考量先前的值。
例如,請考量下列兩份 XML 文件中的 XML 片段:
<MyElement1 attr1="12" />
<MyElement1 attr1="52344" />
當發現第一個 attr1
值時,會根據 attr1
的值將 unsignedByte
的型別推斷為 12
。 當發現第二個 attr1
時,其型別會根據目前推斷型別 unsignedShort
與目前的 unsignedByte
值被提升為 52344
。
此時,請考量下列兩份 XML 文件中的 XML:
<MyElement2 attr2="0" />
<MyElement2 attr2="true" />
當發現第一個 attr2
值時,會根據 attr2
的值將 unsignedByte
的型別推斷為 0
。 當發現第二個 attr2
時,此型別會根據目前推斷型別 string
和目前的 unsignedByte
值提升為 true
,因為在提升推斷型別時,XmlSchemaInference 類別會考量之前的值。 然而,若不是像上述範例一樣在兩個不同的 XML 文件中發現兩個 attr2
,而是在相同的 XML 文件中發現時,attr2
將會被推斷為 boolean
。
https://www.w3.org/2001/XMLSchema-instance \(英文\) 命名空間的被忽略屬性
下列結構描述定義的屬性會在結構描述推斷期間遭到忽略。
屬性 | 描述 |
---|---|
xsi:type |
若發現項目指定了 xsi:type ,則 xsi:type 將被忽略。 |
xsi:nil |
若發現項目具有 xsi:nil 屬性,表示其推斷結構描述中的項目宣告具有 nillable="true" 值。 將 xsi:nil 屬性設為 true 的項目不能有子項目。 |
xsi:schemaLocation |
如果發現 xsi:schemaLocation ,則會加以忽略。 |
xsi:noNamespaceSchemaLocation |
如果發現 xsi:noNamespaceSchemaLocation ,則會加以忽略。 |