什么是EXI?

EXI/

EXI 是 W3C 推荐高效 XML 交换 (EXI) 格式 1.0(第二版)中指定的 XML 的一种非常紧凑的表示。 与标准(文本)XML 相比,EXI 提高了序列化和解析速度,并允许更有效地使用内存和电池寿命。 EXI 流通常比等效的 XML 文档小很多倍,并且需要更少的 CPU 时间来读取或写入。

EXI 可以通过两种主要方式对 XML 文档进行编码 - schemaless 模式和 schema-informed 模式。 在 schemaless 模式下,EXI 可以对任何 XML 文档进行编码,无论模式是否可供编码器使用。 在 schema-informed 模式下,EXI 具有独特的能力,可以利用从 XML 模式中提取的信息来提高编码效率,而通常不需要严格 数据对模式的依从性。 但是,如果用户确定数据根据架构有效,EXI 编码可以甚至更有效。

模式信息的使用使 EXI 编码更有效,因为它允许 EXI 处理器在 EXI 流中的任何点对流中的下一项进行某些预测。 例如,如果模式指定元素“A”(在特定上下文中)必须始终跟随元素“B”,那么当前一个元素是“A”时,元素“B”的出现将被编码为 < span style="text-decoration: underline">零位(在 strict 模式下)。

schemaless 模式下,在编码或解码操作期间,EXI 处理器会根据目前遇到的文档的实际内容不断修改编码每个项目的方式。 例如,当EXI编码器在一个元素“P”的内容中遇到一个元素“C”时,它假设当当前父元素是一个元素时,一个名为“C”的元素比其他名字的元素出现的概率更高 命名为“P”,并创建一种缩写方式来编码名为“C”的元素在名为“P”的元素下的出现。 下一次在名为“P”的元素下遇到名为“C”的元素(相同或具有相同名称的后续元素),EXI 编码器将能够使用“C”的缩写编码,从而保存 空间。

总之,EXI 的用户可以在三个主要选项之间进行选择:(a) 根本不使用模式 (schemaless),(b) 在 一种仅支持有效 XML 文档的方式(schema-informed, strict),以及 (c) 以支持偏离模式的方式使用模式(< span style="font-style:italic">schema-informed, non-strict)。 schema-informed, strict mode 是三者中效率最高的。 schemaless 模式是最容易使用的,因为它不涉及模式。

EXI 与许多其他 XML 压缩技术一样,使用字符串表来临时存储正在编码的 XML 文档中出现的某些类型的字符串,例如名称空间 URI、本地名称、属性值等,以允许后续出现相同的字符串。 要使用短字符串标识符编码的字符串。 在 schemaless 模式下,所有的字符串表都会在编码或解码操作开始时重置。 在 schema-informed 模式中,包含命名空间 URI 和本地名称的字符串表预先填充了取自模式或在 XML 模式建议中定义的字符串,以便 在每个编码或解码操作开始时,这些字符串将是已知的。

EXI 中还有其他选项会影响 EXI 流的内容。其中一些选项,称为 保真度选项,控制 EXI 处理器在 EXI 流中包含某些类型的项目的能力,例如 XML 注释、处理指令和命名空间声明。如果用户对保留在 EXI 编码中的此类项目之一不感兴趣,他们可以选择一个选项,通过不必包含该类型的项目来使 EXI 编码更有效。因此,例如,如果用户声明不需要保留名称空间声明和前缀,则 EXI 流编码器将放弃对这些内容进行编码的能力,并且生成的 EXI 流可能更紧凑。还有另一个保真度选项,它控制简单类型的属性和元素的原始字符串值的保留。当此选项not被选中时,这些值的编码效率更高(例如,类型为xsd:integer< /span> 将被编码为二进制整数而不是字符串),但读取器在读回 EXI 流时不可能重建确切的原始字符串。在许多应用程序中,这种信息丢失是可以接受的,因此不应选择此选项。

EXI 的最后一个主要特性是支持字节对齐压缩。用户可以选择以下四种对齐方式之一:(a) bit-packed 对齐方式,(b) byte-aligned 对齐,(c) 预压缩,和 (d) 压缩跨度>。 Bit-packedcompression 是更紧凑的(compression 通常但不总是比 bit-packed) 更紧凑。 Bit-packedbyte-aligned 是更快的(byte-aligned 可能比 bit-packed 稍快)。 precompressioncompression 都将 EXI 流中的编码数据排列到特定的布局中,其中所有可能相似的编码数据项都靠近在一起。这种安排提高了应用于数据的压缩算法的有效性。 Precompression 本身不执行任何压缩,因为它的唯一目的是为要应用到的外部压缩步骤(EXI 处理器之外)准备 EXI 流EXI 流。 压缩 更进一步,将标准 DEFLATE 算法应用于每个相似的编码数据项块,以生成最终的 EXI 流。