推断简单类型的规则

描述 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,则忽略它。

另请参阅