`

用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 vtd-xml vtd-xml

    这使得开发者能够在不完全解析XML文档的情况下,对特定部分进行操作。 4. **XML修改**:VTD-XML不仅支持XML的读取,还支持XML的修改。通过`XMLModifier`接口,可以插入、删除或替换XML元素和属性,同时保持XML文档...

    vtd-xml XML解析工具

    VTD-XML是一款高效、灵活且功能强大的XML解析工具,由XimpleWare公司开发。它在XML处理领域中因其性能优异、内存占用低而受到广泛关注。"多快好省地建设社会主义"这句话虽然是一种比喻,但形象地表达了VTD-XML在处理...

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

    VTD-XML是一个高效、轻量级的XML解析库,由AutoPilot公司开发,主要用于XML文档的随机访问和导航。本教程将深入探讨VTD-XML的核心概念、使用方法、源码分析以及实例应用,旨在帮助开发者更好地理解和运用这个强大的...

    vtd-xml源码+例程

    例如,可能包含一个例程展示了如何使用VTD-XML解析XML文件,找到某个特定元素,然后提取其子元素的值;另一个例程可能演示如何在已有的XML文档中插入新的元素或修改现有元素。 总的来说,"vtd-xml源码+例程"为...

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

    VTD-XML是一种高效、灵活且轻量级的XML解析库,由VTD Tech公司开发。这个库提供了对XML文档的随机访问和导航功能,特别适用于处理大型XML文档。VTD-XML的主要特点在于它的基于索引的解析方式,这使得在XML数据中的...

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

    **VTD-XML解析器** VTD-XML是由XimpleWare公司开发的一种高效的XML解析技术。它与SAX和DOM相比,具有一些独特的优势: 1. **内存效率**:VTD-XML采用了一种称为VTD(Virtual Tokenized Document)的数据结构,可以...

    VTD-XML.zip_VTD_VTD-XML_instruction_zip

    这个压缩包“VTD-XML.zip_VTD_VTD-XML_instruction_zip”包含了关于VTD-XML的详细使用指南,特别是其中的“VTD-XML.pdf”文件,应该是该库的用户手册或教程。 XML(Extensible Markup Language)是用于存储和传输...

    VTD-XML技术解析XML实例

    它是由VTD Tech公司开发的,主要用于XML的导航、解析和操作。VTD-XML技术的核心是虚拟XML索引(Virtual Token Descriptor, VTD),这种索引能够在不加载整个XML文档到内存的情况下进行快速定位和处理。 XML...

    VTD-XML解析软件.zip

    VTD-XML是一款高效、低内存占用的XML解析软件,由XimpleWare公司开发,它在处理大型XML文档时表现出显著的优势。相比传统的DOM(Document Object Model)和SAX(Simple API for XML)解析器,VTD-XML提供了一种全新...

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

    导入生成的.lib文件后,开发人员可以使用VTD-XML提供的API接口来解析XML或SVG文档。例如,可以调用`vtdNav_init()`初始化导航器,`parseXML()`函数解析XML文件,`getElementByPath()`根据XPath表达式获取元素,`...

    vtd-xml example

    - `AutoParser`类是VTD-XML的主要入口点,用于解析XML文档并生成VTD索引。 - 解析后的VTD索引可以配合`VTDNav`接口进行导航,如查找元素、属性、文本节点等。 - `VTDNav`提供了如`selectElement()`、`...

    vtd-xml相关资料.zip

    1. **非提取式解析**:VTD-XML解析XML文档时,会生成一个索引结构,该索引结构仅占用内存的一小部分,允许用户通过索引快速访问XML文档的任何部分,而无需加载整个文档。 2. **随机访问**:由于使用了索引,VTD-XML...

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

    本示例将探讨如何使用VTD-XML解析器与Volley协同工作,并将其与传统的Pull解析器进行对比。 首先,让我们了解VTD-XML。VTD(Virtual Token Descriptor)是VTD-XML的核心概念,它提供了一种高效的XML解析方法,通过...

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

    针对DOM和SAX存在的问题,VTD-XML提供了一种新的非提取式(non-extractive)XML解析方法,有效地解决了传统解析方式中的诸多效率瓶颈。 **非提取式解析模式**:VTD-XML采用了非提取式的解析方式,即解析过程中不会...

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

    标题和描述中提到的“基于多核处理器的VTD-XML解析性能优化”是指在处理XML文档时,利用多核处理器的优势,通过多线程技术和内存访问优化来提升XML解析器的性能。XML(可扩展标记语言)是用于数据交换和结构化数据...

    vtd-xml解析实例

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

    基于多核处理器的VTD-XML节点查询执行性能优化.pdf

    《基于多核处理器的VTD-XML节点查询执行性能优化》这篇论文主要探讨了在当前主流的多核处理器环境下,如何通过优化VTD-XML(Virtual Token Descriptor XML)技术来提升XML文档节点查询的执行性能。VTD-XML是一种高效...

    使用VTD-XML的无模式C#-XML数据绑定

    无模式(Schemaless)数据绑定意味着在解析XML时不需要预先定义XML结构,这为开发带来了更大的灵活性,因为不需要为每种可能的XML结构创建对应的架构。 在描述中提到,“无需架构即可进行灵活,高效的XML数据绑定”...

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

    使用这样的库,开发者可以在Java项目中方便地集成XML处理功能,利用VTD-XML的强大特性来优化XML处理流程,提高程序的运行效率。 在实际应用中,VTD-XML可以用于XML数据的验证、转换、合并、分割等多种任务。例如,...

    VTD-XML:面向未来的XML处理(第一部分)

    例如,以下代码片段展示了如何使用VTD-XML在C#中解析并提取XML数据: ```csharp using System; using com.ximpleware; public class VTDTest { public static void Main(string[] args) { VTDGen vg = new ...

Global site tag (gtag.js) - Google Analytics