VTD-XML是一种无提取的XML解析方法,它较好的解决了DOM占用内存过大的缺点,并且还提供了快速的解析与遍历、对XPath的支持和增量更新等特性。
为了实现non-extractive(非提取)这个目的,它将原XML文件原封不动的以二进制的方式读进内存,连解码都不做,然后在这个二进制byte数组上解析每个 element的位置并把一些信息记录下来,这种记录就被成为VTD(Virtual Token Descriptor,虚拟令牌描述符)。
之后的遍历操作便在这些保存下来的记录上进行,如果需要提取XML内容就利用记录中的位置等 信息在原始byte数组上进行解码并返回字符串。
VTD(Virtual Token Descriptor,虚拟令牌描述符)结构:
VTD是一个64bits定长的数值类型,记录了每个元素的起始位置(offset),长度(length),深度(depth)以及令牌(元素标签)的类型(type)等信息。
如下图,表示了每个元素的位置及类型信息,对Xml的所有操作都是基于这个数据结构:
它是二进制格式规范,而不是API规范
VTD记录是原始数据类型(32位的整数倍),它编码XML文件中令牌的以下参数:
VTD要求XML文档在内存中保持不变。
我们当前的VTD记录布局进一步指定了以下内容:
深度:8位(b59~b52)最大值为2 ^ 8-1 = 255
令牌类型:4位(b63~b60)
保留位:2位(b31:b30)
单位 - 因为处理模型在内部存储未解码的XML,所以偏移和长度的单位是编码格式的原始字符。对于UTF-8和ISO-8859,长度和偏移量以字节为单位。对于UTF-16,它们是16位字。
由于VTD记录的长度不变,因此基于VTD的XML处理可能具有以下优点:
节省内存:
高性能:
固有持久性:
增量更新:
同时,需要了解VTD的一些局限性:
各种字段的上限:
位级布局的限制:
VTD令牌长度限制:
与DOM相比,VTD-XML显着更快(高达10倍),内存效率更高(高达5倍)。
与SAX / PULL相比,VTD-XML不仅速度更快,而且能够随机访问,因此更易于使用。
VTD-XML同时是解析器和索引器,因为VTD-XML的API直接使用VTD索引来实现解析的目的。
由于众多原因总结如下:
性能:VTD-XML的性能远远优于SAX
易于使用:随机访问与XPath结合使应用程序易于编写
更好的可维护性:应用程序代码更短,更易于理解。
增量更新:偶尔的小变化变得非常有效。
索引:预解析形式的XML将进一步提高处理性能。
内存映射:扩展的VTD-XML可以选择内存映射XML文档,从而可以处理大小大于可用物理内存的XML文件。
其他功能:只能使用VTD-XML剪切,粘贴,拆分和组合XML文档。
为了利用VTD-XML,我们建议开发人员将超大型XML文档拆分为更小,更易于管理的卡盘(<2GB)。
自VTD-XML 2.4以来,XimpleWare引入了一个扩展版本的VTD-XML,能够处理大小达256 GB的XML文档。
通过使用位置缓存(LC),它们本质上是分层元素目录。
位置缓存按每个级别分配; 即,相同的LC索引相同嵌套深度的所有元素。 LC条目是64位整数,其高32位是元素(开始标记)的VTD记录的索引值,并且其低32位指向对应于第一子元素的LC条目。
动机是坚持VTD的获胜策略:恒定令牌长度和固有持久性。
结果:LC成本约为总VTD-XML处理成本的* 10%*。
如果属性名称的索引值是i,则属性值对应于i + 1。