描述 XmlSchemaInference 类如何推断属性和元素的数据类型。
类 XmlSchemaInference 将属性和元素的数据类型推断为简单类型。 本部分介绍潜在的推断类型、如何将多个不同的值与单个类型协调,以及如何处理架构定义 xsi
属性。
推断类型
类 XmlSchemaInference 将元素和属性值推断为简单类型,并在生成的架构中包含类型属性。 所有推断的类型都是简单的类型。 生成的架构中不包含基类型或方面。
在 XML 文档中遇到的值会分别进行检查。 在检查时会推断值的类型。 如果已推断属性或元素的类型,并且遇到与当前推断类型不匹配的属性或元素的值,则 XmlSchemaInference 类将提升每个规则集的类型。 本主题后面的“类型提升”部分将讨论这些规则。
下表列出了生成的架构的可能推断类型。
简单类型 | DESCRIPTION |
---|---|
布尔 | True、false、0、1。 |
字节 (byte) | –128 到 127 范围内的整数。 |
无符号字节 | 0 到 255 范围内的整数。 |
短 | –32768 到 32767 范围内的整数。 |
无符号短整型 | 0 到 65535 范围内的整数。 |
整数 (int) | 在–2147483648到2147483647范围内的整数。 |
无符号整数 | 0 到4294967295范围内的整数。 |
长整型 | 整数的范围是从–9223372036854775808到9223372036854775807。 |
无符号长整数 | 0 到 18446744073709551615 范围内的整数。 |
整数 | 有限数量的数字可能以“-”为前缀。 |
十进制 | 包含 0 到 28 位精度的数字值。 |
漂浮 | 可以依次后接“E”或“e”和表示指数的整数值的十进制数。 十进制值的范围是从 -16777216 到 16777216。 指数值的范围可以是 –149 到 104。 Float 允许特殊值表示无穷大和非数值。 浮点的特殊值为:0、-0、INF、-INF、NaN。 |
翻倍 | 与浮点值相同,但小数值可以位于 -9007199254740992 到9007199254740992的范围内,指数值的范围可以是 –1075 到 970。 Double 允许特殊值表示无穷大和非数值。 浮点的特殊值为:0、-0、INF、-INF、NaN。 |
持续时间 | W3C duration 格式。 |
dateTime | W3C dateTime 格式。 |
时间 | W3C 时间格式。 |
日期 | 年份值限制为 0001 到 9999。 |
年份月份格式 | W3C 公历月和年格式。 |
字符串 | 一个或多个 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类在提升推断类型时确实会考虑以前的值。 但是,如果这两个实例 attr2
在同一 XML 文档中遇到,而不是在上面所示的两个不同的 XML 文档中, attr2
则将被推断为 boolean
。
来自https://www.w3.org/2001/XMLSchema-instance命名空间的被忽略属性
以下是在架构推理过程中忽略的架构定义属性。
特征 | DESCRIPTION |
---|---|
xsi:type |
如果遇到 xsi:type 指定元素,则忽略该 xsi:type 元素。 |
xsi:nil |
如果遇到具有特性的 xsi:nil 元素,则推断架构中的元素声明的值为 nillable="true" . 具有 xsi:nil 属性并设置为 true 的元素不能有子元素。 |
xsi:schemaLocation |
如果遇到xsi:schemaLocation ,则忽略它。 |
xsi:noNamespaceSchemaLocation |
如果遇到xsi:noNamespaceSchemaLocation ,则忽略它。 |