IBM 已经在官方网站上发布了其 Binary XML(简称 XDBX)的规范。本文将对该规范作深入的解析,介绍 XDBX 的总体情况,包含其目的、特点和优势等,并深入分析 XBDX 的结构布局、标签元素、控制信息和扩展性;对使用 XDBX 涉及的具体细节问题也进行了详细的探讨,如数值编码、空白符和转义字符等。通过全面的解读剖析,体现 XDBX 优越的简洁性。

刘长生, 软件工程师, IBM

刘长生,IBM CDL软件工程师,具有多年软件开发经验,曾从事组件库技术的研究,目前从事 DB2 pureXML 相关的开发工作。



高小明, 软件工程师, IBM  

高小明的照片高小明,IBM CDL 软件工程师,具有丰富的开发经验,目前从事 DB2 pureXML 相关的开发工作。



2011 年 1 月 06 日

Binary XML 的产生和现状

1. XML 面临的挑战

XML 是一种良好的数据描述语言,具有强大的数据描述能力,同时具备自描述的特征,使得人和机器都能阅读 XML 文档。XML 技术本身的特征及其相关技术的标准化,使得 XML 在 Web 技术等领域具有极其广泛的应用,XML 是不同的系统之间数据交换的通用格式,以 XML 为接口的自动化系统具有良好的交互性。但是,XML 技术本身很复杂,处理 XML 将给系统增加相当的工作负荷,XML 的冗余也增加了系统之间的网络开销。因此,XML 技术在异常繁荣的同时,也备受诟病,尤其是资源受限和高性能要求的系统无法承受 XML 的复杂性和数据冗余。

2. Binary XML 的产生和发展

在资源受限的运算系统中,如无线应用中,由于网络带宽的制约,人们在使用 XML 作为传输数据的格式时,为了减低数据冗余,提高带宽利用率,想到了 XML 压缩技术,但这却进一步增加了本机的运算负荷。如何在提高 XML 的网络传输效率的同时,减轻单机 XML 的运算压力,变成了人们探究的课题。Binary XML 正是在此背景下应运而生,解决了资源受限的运算系统使用 XML 的重要难题。

Binary XML 是 XML 数据紧凑的二进制表示形式,显著地降低了 XML 数据的冗余性,使得 XML 数据的解析也变得容易很多,减轻了处理 XML 数据的系统的运算工作,降低了 XML 数据传输时所占的带宽。Binary XML 首先由无线应用领域提出并使用,先后有一些不同的规范出现,包括 Wbxml(WAP Binary XML)、Fast Infoset(X.891)和 EXI(Efficient XML Interchange)等。除了资源受限因素,许多要求高性能的系统,如数据库,也开始采用 Binary XML 来传输 XML 数据,完成 XML 数据的处理。IBM 等公司也提出了自己的 Binary XML 规范,用于其数据库管理系统和其他产品,加速 XML 数据的处理,在现有的运算和网络资源的条件下,获取比 Textual XML(在与 Binary XML 比较时,我们将使用这一术语称呼传统的 XML 格式)更加优越的性能。

目前 Binary XML 存在多种规范,但是还没有一种广泛使用的、赢得普遍共识的标准。最近,W3C 已经接受 EXI 为其推荐的标准,但是 EXI 能否被广泛接受并各种系统中得到应用,还需要观察。


XDBX 总览

为了提高产品中 XML 数据的处理性能,提高不同产品之间的 XML 传输效率,IBM 提出了自己的 Binary XML 规范,即 Extensible Dynamic Binary XML-Client/Server Binary XML Format,简称 XDBX。请参阅 Binary XML specification 文档

概括地说,XDBX 用一系列标签(Tag)来表达 XML 数据,包括 XML 文档中的元素(Element)、属性(Attribute)、文本(Text)、处理指令(PI)和注释(Comment)等。清单 1 和清单 2 给出了一个简单的 XML 文档及其对应的 XDBX 表示。

清单 1. XML 示例文档
 <root> 
  <name mgr = "NO">Joe</name> 
  <name>Susan</name> 
  <name>Bill</name> 
 </root>
清单 2. 示例 XML 对应的 XDBX
 X4root100X4name200Y3mgr3002NOU3Joeze2U5Susanze2U4BillzzZ

清单 2 所示的 XDBX 内容就是一组标签序列,如“X”标签表示 XML 文档中的元素,“X4root”表示字符长度为 4的元素“root”,“ X4root00”中的最后两个“0”表示元素“root”没有前缀和命名空间,“X4root00”就是一个完整意义的标签单元。XDBX具体的编码规则,将在后面详细介绍。

1. XDBX 的特点

与其它 Binary XML 一样,XDBX 也是一种紧凑而简洁的 XML 数据的二进制表示形式,显著地减少了 Textual XML 的冗余,降低了 XML 数据解析的代价。除了具备 Binary XML 的共性之外,XDBX 有自己的特点,归纳起来,包括以下几个方面。

支持 XML 文档和序列(sequence)

格式良好的 Textual XML 只支持合法的 XML 文档,即只有一个 root 节点。XDBX 不仅支持单 root 节点的 XML 文档,还支持 XDM(Xquery Data Model)中的 XML Sequence。所以单一的 XML 文档可以用 XDBX 来表示,使用 Xquery 查询得到的 XML Sequence 结果也可以表示为 XDBX。

使用 stringID 代替字符串文本

在 Textual XML 中,所有元素和属性等名称都是文本格式的字符串,这些名称在 XML 文档中往往会重复出现,使得信息变得冗余,在 XDBX 中,将文本格式的字符串替换为数值,称为 stringID。

XML 内容标签化

所有的 XML 内容在 XDBX 中都以标签来表示,更准确的说,相对独立的 XML 内容,如元素、属性等,由一个标签单元来表达。一般地,标签单元包括标签本身(Tag)、数据长度(Length)和数据值(Value),即 TLV。但标签单元有许多 TLV 的变形,有的只有标签本身,有的除了 TLV 之外,还有其他结合在一起的要素,如清单 2 中“X4root00”标签单元中“X4root”之后还有分别表示没有前缀和命名空间的两个 stringID“0”。在解析 Textual XML 时,我们必须逐个字符的扫描,寻找 XML 元素名称、属性名称、字符文本以及属性值等各种组成部分在何处结束,而 XML 内容的标签化,免除了这一琐碎麻烦的工作。

前置的文本数据长度

在 XDBX 中,文本数据的长度信息总是出现在文本之前,这样我们可以预先知道将要读取处理的数据有多大,需要分配多大的空间,可以整体拷贝,而不像 Textual XML 那样只有读到结束符时才能确定文本数据的大小。所以,XDBX 处理器具有一定的“先知”功能,预判处理数据所需的系统资源。

数据自完整性

Textual XML 中可能有 DTD 实体(Entity)的引用,XML 处理器需要访问实体的定义,解析展开;而 XDBX 不会实体引用,也就是说,如果待表示的 XML 中含有实体引用,那么必须在生成 XDBX 之前被解析。这也使得 XDBX 具备自我完整性,也变得更为简洁,使得 XDBX 的解析也更为轻巧,不需要在解析时扫描每一个字符,判断是否出现实体的引用。

UTF-8 字符编码

XDBX 中所有字符(非数值)都是 UTF-8 编码的,不像 Textual XML 中可以指定不同的字符编码,这就避免了 XML 数据在不同系统发送和接受时可能发生的代码页(Codepage)转换。同时,简化了 XML 数据表示的复杂性,由于 UTF-8 对各种语言文字的普遍支持,XDBX 仍然具有广泛的国际化的表达能力,没有损害 XML 的通用性。

采用大端字节序

在 XDBX 中,多字节的字符或数值采用大端字节序的编码方式,更适合网络传输,消除了不必要的网络字节序变换,减低了数据通信潜在的复杂性。

数值的变长编码

对于取值范围很大的数值,也就是说数值可能很大,也可能很小,XDBX 采用变长的编码方式来表示。对于这类数值,使用定长的表示方式,要么表示不了很大的取值,要么浪费存储空间,所以变长编码是一种适宜的方法。

私有扩展性

XDBX 提供了扩展的表达能力,除了使用 XDBX 预定义的所有标签来表达完整的 XML 数据组成部分,用户可以定义私有的标签,扩展 XDBX 的表示能力,满足特定的业务需求,在约定的数据交互各方之间方便的传递额外的私有信息。

上述的这些特性中的有些内容,将在后面进一步予以更为详细的介绍。

2. XDBX 的优势

XDBX 的特点已经隐含了这一编码方式的优势,具体的说,XDBX 不仅降低了 XML 的信息冗余,而且一般情况使得 XML 数据更少,起到了压缩的作用;解析 XDBX 的代价更低,需要的系统资源更少,解析速度更快。

在 XML 中元素总是以“<elementName>”和“</elementName>”开始和结束,本身就存在信息的冗余,标签化的表示方式消除了这一冗余,并在通常情况下有效的减少了数据的长度;重复出现的文本被 stringID 代替,原本较长的字符串有一个数值来表示,显著地减少了冗余信息,同时压缩了 XML 的数据长度。

XDBX 的标签化方式使得处理器不需要扫描每一个字符,识别 XML 结构的结束符;使用数值代替文本不仅降低信息冗余、压缩数据长度,还使得数据的比较操作更快、更容易;长度前置使得块拷贝成为可能,也避免了处理器动态的分配变长内存;XDBX 的自完整性,避免了实体引用的解析过程;UTF-8 编码消除了 XML 数据代码页转换,而大端字节序的编码方式则是的处理器无需进行网络字节序和本机字节序的转换。所有这些,都将 XDBX 的解析轻量化,解析时需要的系统资源显著减少,解析的速度得到很大提高。


解构 XDBX

1. 结构布局

在前面清单 2 中,我们曾给出简单 XML 文档的 XDBX 示例,现在介绍 XDBX 完整的结构布局(Layout)。如图 1 所示,完整的 XDBX 由头部(XDBX Header)和主体(XDBX Body)构成。XDBX 头部包括标识 XDBX 的魔数(Magic Number)、头部长度(Length)、版本号(Version)和编码控制信息(Encoding Flag),XDBX 主体则是有一串标签单元构成的,标签“Z”是整个 XDBX 结束的标志。

图 1. XDBX 的结构布局
图 1. XDBX 的结构布局

在 XDBX 头部,魔数占 2 个字节,取值为固定的 0xCA3B;头部长度是指后续的版本和编码控制信息所占的字节数,用一个字节表示,目前取值为 5;XDBX 版本在目前的规范中只有一个取值 V1.0,版本号为数字 1,占一个字节;编码控制信息共有 4 个字节,每一个位(bit)取值 0 或 1,表示不同的编码约束,如最末位取 0 表示 XML 文档,取 1 表示 XML 序列,更详细内容在后面将会介绍。

清单 2 就是一个 XDBX 主体的例子,有多个表达 XML 组成部分的标签单元构成的,最后以“Z”结束。至于 XDBX 中有哪些标签,它们的单元构成以及表达哪种 XML 节点类型,也将在后文予以介绍。需要说明的是,为了显示的方便,清单 1 所示 XDBX 中的数字也使用其 ASCII 码字符表示,但在实际的 XDBX 中是二进制的数值,并非 ASCII 码。图 2 显示了示例 XML 文档的实际 XDBX 编码表示。

图 2. 示例 XML 文档的完整 XDBX
图 2. 示例 XML 文档的完整 XDBX

最左侧是 XDBX 数据所在逻辑地址,每行 16 个字节,中间是二进制值,右侧是 ASCII 码显示。与清单 2 对比,图 2 完整的 XDBX 包括头部信息和 XML 声明,还有重要的区别是长度在内存中就是数值,不是清单 2 中为显示方便的字符,其次,包括了清单 2 中为简明起见而省略的空白符(“W”标签单元),因为原本 Textual XML 中包含美化格式的回车换行符。

2. XDBX 标签

XDBX 规范中一共定义了 25 个标签,可分为 9 类:XML 文档 / 序列标签、XML 声明标签、XML 元素标签、XML 属性标签、XML 命名空间映射标签、文本标签、注释标签、处理指令标签及其它标签。各类标签、单元格式及其含义,列于表 1。

表 1. XDBX 标签
分类 数值 ASCII 标签单元格式及含义
文档 /序列 90 Z XDBX 的结束符
64 @ XML 序列的分隔符
100 d 文档节点,表明后续是 XML 文档
70 F DOCTYPE,标签单元的格式为 Tid(root) /id(systemID/id(publicID)
XML声明 76 L XML 版本,标签单元的格式为 TLV(version)
68 D XML Encoding,标签单元的格式为 TLV(encoding)
116 t Standalone 属性,标签单元的格式 TV(standalone),Value 为 0 或 1
XML元素 101 e 无命名空间,使用 stringID,标签单元的格式为 Tid(localname)
88 X 标签单元的格式为 TLVid(localname) / id(prefix) / id(uri),用于定义并使用元素名称的 stringID,无命名空间时,前缀和 URL 的 stringID 为 0
120 x 标签单元的格式为 Tid(localname) / id(prefix) / id(uri),元素名称已定义时使用
122 z 元素结束符
XML属性 97 a 标签单元的格式为 Tid(localname) / LV(attribute-value),属性无命名空间
89 Y 标签单元的格式为 TLVid(localname) / id(prefix) / id(uri) / LV(attribute-value),属性名称的 stringID 未定义,无命名空间时,前缀和 URL 的 stringID 为 0
121 y 标签单元的格式为 Tid(localname) / id(prefix) / id(uri) / LV(attribute-value),属性名称已定义时使用
98 b 标签单元的格式为 Tid(localname) / id(prefix) / id(uri) / LV(attribute-value),与“y”类似,只是指示属性值中没有转移字符
命名空间 109 m 标签单元的格式为 Tid(prefix) /id(namespace-uri),将命名空间的前缀和 URL 通过其 stringID 映射关联
字符文本 84 T XML 文本节点, 标签单元的格式为 TLV(text)
85 U XML 文本节点,标签单元的格式为 TLV(text),文本中无转义字符 .
67 C CDATA,标签单元的格式为 TLV(text)
87 W 空白符, 标签单元的格式为 TLV(text) form,空白符包含一个或多个空格 (#x20)、回车 (#x0d)、换行 (#x0a)、 制表符 (#x09)、 Unicode 分行符 (#x2028) 或 NEL (#x85)
86 V Atomic Value,标签单元的格式为 TLV(text)
注释 99 c 注释,标签单元的格式为 TLV(comment)
处理指令 80 P Processing Instruction,标签单元的格式为 Tid(target)/LV(value)
其它 73 I StringID 定义标签,为文本字符串定义其 stringID,标签单元的格式为 TLVid(string)
72 H 提示标签,包括数据交换双方约定的额外信息,标签单元的格式为 TLV/LV

从表中可以看到,表示同一个 XML 节点,如元素,根据情况可以选择使用不同的标签,所以同一 XML 文档 / 序列的 XDBX 并不是唯一的,依赖于具体的处理器,但这些不同的 XDBX 表示具有相同的 XML 语义。

3. 控制信息

在 XDBX 的头部有 4 个字节用来设置各种编码标志(Encoding Flag),这些标志位就是 XDBX 编码的控制信息,它们指示了 XDBX 主体部分是怎样编码的,主要包括:

XDBX 文档类型标志(Document Type)

x00000000 表示 XDBX 是 XML 文档,x00000001 表示是 XML 序列。

stringID 标志(StringID Flag)

该标志目前必须被设置(x00000002),新版本的规范可以予以扩展。

稠密 stringID 标志(Dense StringIDs Used Flag)

该标志被设置时 (x00000020) 表明,stringID 从小到大连续增长,以便使用简单的数组(而非 Hash 表)构建 stringID 与字符串的映射表。

合法性标志(Valid Flag)

该标志位如果被设置 (x00000080),表示 XDBX 是一个遵从 XML Schema 的合法的 XML 文档或遵从 XML Schema 的 XML 文档构成的 XML 序列。

4. 扩展性

XDBX 规范中预定义了能够充分表达 XML 各种节点类型的标签,同时将取值在 201 – 250 范围的标签保留,它们不会被 XDBX 新版规范所使用,以便用户可以进行私有扩展,在形成约定的 XML 数据通信各方之间传递更多的信息。


使用 XDBX 的若干细节

在使用 XDBX 时,有几个重要的细节值得注意,它们包括如何对数值进行变长编码、XDBX 空白字符、转移字符及其处理。

1. 数值的变长编码

在 XDBX 中,数据长度和 stringID 的值都是变长的,取值是多字节时采用大端字节序。数值的变长编码规则如下:每一个字节低 7 位为有效值,最高位作为标志位使用,标志位为 0 表示该字节为数值编码的最后一个字节,反之,表明后续字节仍然是数值编码字节。例如,二进制编码 00000101表示数值 5,10000101 00100001表示二进制数 1010100001,即数值 673。另外,XDBX目前的版本规定变长编码的数值在有符号 32bit整型范围内,所以合法的数值变长编码表示不应该超过 5个字节。

2. 空白符

XDBX 的空白符包含一个或多个空格 (#x20)、回车 (#x0d)、换行 (#x0a)、 制表符 (#x09)、 Unicode 分行符 (#x2028) 或 NEL (#x85)。空白符往往是在不同的平台上为了提高 Textual XML 可读性,进行排版时引入的。在 XDBX 中使用“W” 标签专门表达这种空白符,我们使用 XDBX 时,可以根据实际需要,通过处理“W”标签,方便地保留或去除它们。

3. 转义字符

在 Textual XML 中,有一些特殊字符不能原样地出现在文档中,但可以通过字符引用(Character reference)或实体引用(Entity reference)表示它们。由于 XDBX 本身二进制表示的特性,不需要规避特殊字符,如 X 是一个标签字符,在文本中仍然可以出现字符 X。但是考虑到将 XDBX 串行化为 Textual XML 时的效率,XDBX 中仍然定义了如下的转义字符:

  • '<' (#x3c)
  • '>' (#x3e)
  • '&' (#x26)
  • carriage return (#x0d)
  • single quote (#x27)
  • double quote (#x22)
  • tab (#x09)
  • linefeed (#x0a)

当这些字符出现在 XDBX 文档中,在串行化为 Textual XML 时,XDBX 处理器需要逐个检查文本中是否包含这些字符,并使用字符引用或实体引用来替换这些字符。而在文本中没有这些字符时,处理器就可以“放心”的进行块拷贝,无需考虑字符替换的问题,显然可以提高效率。XDBX 中有一些标签能够保证文本中不含转义字符,如 b 和 U 等。所以在 XDBX 编码时应该优先考虑这样的标签,提高后续 XML 串行化的效率。


结论

本文对 IBM 的 Binary XML 即 XDBX 的各个主要方面做了介绍,比较全面地解读了 XDBX。从中我们可以看到,XDBX 简化了 XML 的复杂性,有效地降低了 XML 的信息冗余,显著地提高了 XML 数据传输效率,加快了 XML 数据解析和处理的速度。总之,XDBX 充分地诠释了简洁之美。

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML
ArticleID=606726
ArticleTitle=简洁之美:解读 XDBX
publish-date=01062011