`

用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解析工具

    新兴的XML处理工具,多快好省地建设社会主义。

    VTD-XML c源码及vs2013编译生成的lib

    官网上下载的VTD-XML-c源码 ,经过vs2013编译生成lib文件,将lib导入工程即可使用VS来解析svg或xml

    基于多核处理器的VTD-XML解析性能优化.pdf

    基于多核处理器的VTD-XML解析性能优化.pdf

    VTD-XML解析软件.zip

    ximpleware_2.6_java.zip VTD-XML:随机访问能力,高性能,低内存占用率,相比于DOM和SAX有着本质和全面的改进.

    VTD-XML-Example:使用 VTD-XML 解析器与 volley 并与 pull 解析器进行比较的示例

    VTD-XML-示例使用 VTD-XML 解析器与 volley 并与 pull 解析器进行比较的示例。

    vtd-xml相关资料.zip

    vtd-xml解析技术相关资料以及相关的代码示例demo vtd-xml是一种xml解析技术,效率高于dom和sax解析方式

    vtd-xml解析实例

    网上vtd的使用资料比较少,可能是太简单了没人想写吧。自己写的Demo,对VTDNav、AutoPilot进一步进行封装,从而简化解析代码,仅供参考 上传后才发现上传的demo.xml错了,貌似无法重新上传,内容应该是 <?xml ...

    VTD-XML技术解析XML实例

    NULL 博文链接:https://lfl2011.iteye.com/blog/2196102

    vtd-xml+教程+源码+事例+集合

    vtd-xml+教程+源码+事例+集合, 是一种新型的xml解析方法! 网上的教程不是很多!搜集了一些!

    简化XML处理详解

    把VTD-XML和一些流行的XML解析器就性能和内存使用方面作一比较。通过时延和吞吐率来呈现XML解析性能。从时延方面比较了VTD-XML和DOM(不支持延迟节点扩展特性)的浏览性能。VTD-XML的性能与其他解析器相比优势明显,...

    新兴XML处理方法VTD-XML介绍

    通常当我们提起XML的使用时,最头痛的部分便是XML的verbosity与XML的解析速度,当需要处理大XML文件时这个问题便变得格外严重。我在这里提及的,便是如何优化XML处理速度的话题。

    VTD-XML: The Future of XML Processing-开源

    VTD-XML是下一代XML解析器/索引器/编辑器/切片器/汇编器/ xpath引擎,在性能,内存使用和易用性方面超越了DOM,SAX和PULL。

    VTD-XML 不同于SAX和DOM的XML高效解析器

    不同于SAX和DOM的XML高效解析器,内存占用少,速度快,支持XPATH;用多种语言实现,C,JAVA等

    JavaXML解析器FastXml.zip

    性能最好的xml解析器:性能是VTD-XMl的3倍,是XPP3/MXP1的2倍,详见性能测试数据和测试代码 几乎不消耗额外的内存:内存消耗比XPP3/MXP1还要少很多 没有jar包依赖 jar包大小为18k,非常适合在移动...

    xml解析方式大全

    xml解析方式包括w3c dom,sax,xpp,stax,vtd方式,其实还有jdom和xmlevent这样才够全面

    XML高效解析器对比测试(Java工程)

    本Java项目对SAX,XPP,VTD三种高效的XML解析技术进行了对比测试。如果你只想知道结果: 连续10,000XML解析(简单XML): SAX:16157 XPP:3875 VTD:2218 请将本项目解压后导入Eclipse,并使用Junit4运行。本资源也可作为SAX...

Global site tag (gtag.js) - Google Analytics