推斷簡單型別的規則
更新: November 2007
說明 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 之間的整數。 |
integer |
可能會以 "-" 開頭的有限數值。 |
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 的型別會根據值 12 被推斷為 unsignedByte。當發現第二個 attr1 時,其型別會根據目前推斷型別 unsignedByte 與目前的 52344 值被提升為 unsignedShort。
此時,請考量下列兩份 XML 文件中的 XML:
<MyElement2 attr2="0" />
<MyElement2 attr2="true" />
當發現第一個 attr2 值時,會根據 0 的值將 attr2 的型別推斷為 unsignedByte。當發現第二個 attr2 時,此型別會根據目前推斷型別 unsignedByte 和目前的 true 值提升為 string,因為在提升推斷型別時,XmlSchemaInference 類別會考量之前的值。然而,若不是像上述範例一樣在兩個不同的 XML 文件中發現兩個 attr2,而是在相同的 XML 文件中發現時,attr2 將會被推斷為 boolean。
http://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,則會加以忽略。 |