用VTD-XML解析XML

用VTD-XML解析XML

一、XML解析技术有哪些

在我们进行XML解析的时候,最头疼的部分就是XML的大小和XML的解析速度了,当我们在处理大XML文件的时候,这些问题变得更加严重。

在我们处理XML的时候,大概会有以下选择:

1、DOM,DOM是W3C标准。是一个使程序和脚本有能力动态地访问和更新文档的内容、结构以及样式的平台和语言中立的接口。它将XML的结构信息以树形的方式构建,提供了遍历这颗树的接口与方法。

2、SAX以一个串流解析器的型式作用,拥有事件驱动API。由使用者定义回调函数,解析时,若发生事件的话会被调用。SAX 处理时单方向性的;解析过的资料无法在不重新开始的情况下再次读取。

DOM和SAX解析的优缺点如下:

DOM

(1)优点:易用性强,因为所有的XML结构信息都存在于内存中,并且遍历简单,支持XPath。

(2)缺点:解析速度太慢,内存占用过高(原文件的5x~10x),对于大文件来说几乎不可能使用。

SAX

(1)优点:解析速度快,内存占用不与XML的大小相关联(可以做到XML涨内存不涨)。

(2)易用性差,因为没有结构信息,并且无法遍历,不支持XPath。如果需要结构的话只能读一点构造一点,这样维护性差。

二、VTD-XML简介

VTD-XML它是一个non-extractiveXML parser,由于它出色的机制,很好的解决(避免)了内存占用过大和解析速度慢等各种问题,并且还“顺便”带来了non-extractive的其他好处,像快速的解析与遍历、XPath的支持、Incremental Update等等。我这里有一组数据,取自于VTD-XML的官方网站:

VTD-XML的解析速度是SAX(with NULL content handler)的1.5x~2.0x。With NULL content handler的意思就是说SAX解析中没有插入任何额外的处理逻辑,也就是SAX的最高速度。

VTD-XML的内存占用是原XML的1.3x~1.5x(其中1.0x的部分是原XML,0.3x~0.5x是VTD-XML占用的部分),而DOM的内存占用则是原XML的5x~10x。举一个例子,如果一个XML的大小是50MB,那么用VTD-XML读取进来内存占用会在 65MB~75MB之间,而DOM的内存占用则会在250M~500MB之间。基于这个数据用DOM处理大的XML文件几乎是不可能的选择。

三、VTD-XML原理

VTD(Virtual Token Descriptor,虚拟令牌描述符)是一个64bits长度的数值类型,记录了每个元素的起始位置,长度,深度以及令牌的类型等信息,如图1所示。64bits固定长度使得可以用数组这种高效的结构来组织VTD,大幅提高性能。VTD是实现无提取解析的关键,它类似于XML文档中元素的指针,通过它可以快速定位到某个元素。


图1 VTD记录的比特层格式

令牌开始偏移量(即相对于XML文档头部的距离)是30 bits,也就是说它能解析的最大文件是2^30 -1 = 1G -1。

令牌长度为20 bits,即一个令牌的最大长度是2^20-1=1M-1。

其中前缀长度:2^9-1=255

序列名长度:2^11-1=1024

令牌类型4bits,说明支持16种词汇类型。

为了实现无提取这个目的,VTD-XML将原XML文件原封不动的以二进制的方式读进内存,不做解码,然后在这个比特数组上解析每个元素的位置并把一些信息,如XML令牌的开始偏移量、长度、深度和令牌类型,记录下来,保存为VTD数组,之后的遍历操作便可在VTD数组上进行。如果需要提取XML内容,就查找VTD数组,利用VTD记录中的位置等信息在原始比特数组上进行解码并返回字符串。

而且VTD-XML还可以高效的实现增量更新,例如,如果想在一个大型XML文档中找出一个节点元素并删除它,那么只需要找到这个元素的VTD,将这个VTD从VTD数组中删除,然后再利用所有的VTD写出到另一个二进制数组中就可以了,因为删除的VTD标明了要删除的元素的位置,所以在新写入的二进制数组中就不会出现这段元素了。用VTD写入新的二进制数组的过程实际上就是一个二进制数组的拷贝过程,其效率是非常高的。

由此可见,VTD很好的解决了前两种解析方式的缺点,通过其巧妙的设计使得在解析XML文档时内存占用少,效率高,并且还能够实现XML文档的快速解析与遍历、提供对XPath的支持。VTD的出现是XML解析技术的一大进步,会对XML解析技术的发展产生巨大影响。

VTD-XML解析XML分为以下几步:

1. 以一个byte数组开始(存放xml);

2. 利用VTDGen进行解析;

3. 利用VTDNav进行导航定位;

4. 节点遍历使用Autopilot;

5. 利用Xpath进行节点选择

6. 增量更新使用XMLModifier

你可能感兴趣的:(用VTD-XML解析XML)