`
yunnick
  • 浏览: 392578 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

XML解析技术之VTD-XML 简介及代码实例

阅读更多

第一部分:XML解析技术简介

       XML(eXtensible Markup Language,可扩展标记语言)是由World Wide Web联盟(W3C)定义的元语言,即一种关于语言的语言。 Xml的优势或者说力量源于它的数据独立性,广泛应用在分布式计算领域。


XML解析技术的分类


根据从XML中获取数据的简易性,性能和最终所得到的数据模型的不同,XML解析技术大致可分为以下四类:
1.面向文档的流式解析;
2.面向文档的对象式解析;
3.面向文档的指针式解析;
4.面向应用的对象式解析;


这四类解析技术分别处于不同的抽象层次,适用于不同的应用场景, 针对具体的应用需求,选择合适的解析技术,往往能够减少内存消耗,缩短处理时间,更方便地获取数据,提高应用系统的整体性能。

1.1 面向文档的流式解析

流式解析是解析器顺序读取XML文档,捕获的各种事件,如元素开始和元素结束等,交由程序处理。
流式解析又分为两种解析方式:
1.推式解析(SAX:Simple API for XML)
2.拉式解析(StAX:Streaming API for XML)
这两种方式的主要区别在于是由解析器还是应用程序控制读循环(读入文件的循环)

 1.1.1推式解析(SAX)

在这种解析方式中,解析器控制着读循环,在文档结束之前控制权不会返回给应用程序。

SAX是基于事件驱动的,即SAX解析器在读取XML文档的过程中生成一个事件流,并且对于每个事件通过回调事件处理程序中相应的方法来进行处理。比如元素开始和结束标记,元素内容,实体,语法分析错误等事件。

下图表示了一个Xml文件及其对应的文件流格式。

注:如图所示,回车换行也被解析成了一个字符。

SAX数据流

 1.1.2拉式解析(StAX)

在这种解析方式中,应用程序控制着读循环。反复调用解析器获得下一个事件,直到文档结束。

StAX针对同样的XML文档所获得事件类型和SAX基本相同。

1.2 面向文档的对象式解析

 

DOM(Document Object Model)是用与平台和语言无关的方式对XML文档进行建模的官方W3C标准 。

DOM的层次化对象模型是一个树形结构,它将一个XML文档看作一棵节点树,每个节点代表一个XML文档中的元素。
DOM的有点在于可以随机访问,但由于DOM在使用数据前需要完整的遍历XML文档,在内存中构建树形结构表示,因此需要消耗大量的内存,尤其是对于大型文档,性能下降的很快。

 

下图表示了Xml文件预期Dom树的对应关系。
DOM树

1.3 面向文档的指针式解析

面向文档的流式解析效率较高,但易用性差,而对象式解析易用性强,却效率较低。
这两种方式都是提取式解析(extractive parsing)。拿DOM这个例子来说,DOM会将每一个element, attribute等都在内存中解析成对象并给与一定结构。

更新 效率问题:这种Dom解析模式注定了需要大量的创建和销毁对象(GC问题),在DOM中(SAX并不支持更新),每一次改动都需要将DOM模型重新完整的解析成XML字符串,原文件并没有被利用,即DOM并不支持增量更新。为了解决这些问题,提出了一种较新颖的指针式解析技术,即VTD-XML(一种面向文档的指针式解析)。

 

二、VTD-XML基本原理介绍

 

VTD-XML是一种无提取的XML解析方法,它较好的解决了DOM占用内存过大的缺点,并且还提供了快速的解析与遍历、对XPath的支持和增量更新等特性。VTD-XML是一个开源项目,目前有Java、C两种平台支持。

2.1 VTD-XML基本原理

 

为了实现non-extractive(非提取)这个目的,它将原XML文件原封不动的以二进制的方式读进内存,连解码都不做,然后在这个二进制byte数组上解析每个 element的位置并把一些信息记录下来,这种记录就被成为VTD(Virtual Token Descriptor,虚拟令牌描述符)。

之后的遍历操作便在这些保存下来的记录上进行,如果需要提取XML内容就利用记录中的位置等 信息在原始byte数组上进行解码并返回字符串。
VTD(Virtual Token Descriptor,虚拟令牌描述符)结构
VTD是一个64bits定长的数值类型,记录了每个元素的起始位置(offset),长度(length),深度(depth)以及令牌(元素标签)的类型(type)等信息。

如下图,表示了每个元素的位置及类型信息,对Xml的所有操作都是基于这个数据结构。

VTD 

 

下图表示了VTD目前所支持的所有元素的类型(12种):

 

VTD类型图

 

查询与更新:
如果需要提取XML内容,就查找VTD数组,利用VTD记录中的位置等信息在原始比特数组上进行解码并返回字符串。
而且VTD-XML还可以高效的实现增量更新,例如,如果想在一个大型XML文档中找出一个节点元素并删除它,那么只需要找到这个元素的VTD,将这个VTD从VTD数组中删除,然后再利用所有的VTD写出到另一个二进制数组中就可以了,这就是所谓增量更新。这个过程实际上就是一个二进制数组的拷贝过程,其效率是非常高的。

 

下图是三种主要的XML解析的相关功能及性能比较:

 

三种XML解析比较

第三部分:应用实例

 

VTD-XML解析xml通常经过以下几步:
    1.以一个byte数组开始(存放xml);
    2.利用VTDGen进行解析;
    3. 利用VTDNav进行导航定位;
    4. 节点遍历使用Autopilot;
    5. 利用Xpath进行节点选择
    6. 增量更新使用XMLModifier

 

下面的代码主要功能:首先根据Xpath选择某些属性partNum='872-AA' 的item元素并用someting元素替换;替换价格小于40的元素文本为200.

 

/* In this java program, we demonstrate how to use XMLModifier to incrementally
 * update an simple XML purchase order.
 * a particular name space. We also are going 
 * to use VTDGen's parseFile to simplify programming.
 */
import java.io.File;
import java.io.FileOutputStream;

import com.ximpleware.AutoPilot;
import com.ximpleware.ModifyException;
import com.ximpleware.NavException;
import com.ximpleware.VTDGen;
import com.ximpleware.VTDNav;
import com.ximpleware.XMLModifier;

public class update {

  public static void main(String argv[]){
     try {
	// open a file and read the content into a byte array
	VTDGen vg = new VTDGen();
	String path = update.class.getResource("").getPath();
	System.out.println(path);
	
	if (vg.parseFile(path + "oldpo.xml", true)){
		VTDNav vn = vg.getNav();
		File fo = new File("f:/newpo.xml");
		FileOutputStream fos = new FileOutputStream(fo);
		AutoPilot ap = new AutoPilot(vn);
		XMLModifier xm = new XMLModifier(vn);
		ap.selectXPath("/purchaseOrder/items/item[@partNum='872-AA']");
		int i = -1;
		while((i=ap.evalXPath())!=-1){
			xm.remove();
			xm.insertBeforeElement("<something/>\n");	
		}
		ap.selectXPath("/purchaseOrder/items/item/USPrice[.<40]/text()");
		while((i=ap.evalXPath())!=-1){
			xm.updateToken(i,"200");
		}
		xm.output(fos);
		fos.close();
	}
     }
     catch (NavException e){
	     System.out.println(" Exception during navigation "+e);
     }
     catch (ModifyException e){
	     System.out.println(" Modify exception occurred "+e);
     }
     catch (Exception e){
     }
  }

 修改前的Xml文件:

 

<?xml version="1.0" encoding="UTF-8"?>
<purchaseOrder orderDate="1999-10-20">
    <comment>Hurry, my lawn is going wild!</comment>
    <items>
        <item partNum="872-AA">
            <productName>Lawnmower</productName>
      <quantity><![CDATA[1]]></quantity>
            <USPrice>148.95</USPrice>
            <comment>Confirm this is electric</comment>
        </item>
        <item partNum="926-AA">
            <productName>Baby Monitor</productName>
            <quantity>1</quantity>
            <USPrice>39.98</USPrice>
            <shipDate>1999-05-21</shipDate>
        </item>
    </items>
</purchaseOrder>

 

 

修改后的Xml文件,红色字体为修改后的:

<?xml version="1.0"?>
<purchaseOrder orderDate="1999-10-20">
    <comment>Hurry, my lawn is going wild!</comment>
    <items>
        <something/>
       <item partNum="926-AA">
            <productName>Baby Monitor</productName>
            <quantity>1</quantity>
            <USPrice>200</USPrice>
            <shipDate>1999-05-21</shipDate>
        </item>
    </items>
</purchaseOrder>

官网地址:http://vtd-xml.sourceforge.net/ 

ps:14年有更新还有详细的性能对比,跟有利于学习使用


第四部分:其他解析方式

 

前面所谈到的三种解析技术都是面向文档的,还有第四种解析技术:面向应用的对象式解析技术。

面向文档的解析技术对主要关心文档的XML结构的应用程序来说是适用的,但是有很多应用程序仅仅将XML作为数据交换的媒介,它们更关心的是文档数据本身,而面向应用的对象式解析技术更适用。
面向应用的对象式解析技术又称为为XML数据绑定,指将数据从一些存储媒介(如XML文档、文本文件和数据库)中取出,并通过应用程序表示这些数据的过程,即把数据绑定到虚拟机能够理解并且可以操作的某种内存中的结构。

数据绑定并不是一个新鲜的概念,其在关系数据库上早已得到了广泛的应用,如Hibernate就是针对数据库的轻量级数据绑定框架。

对象式解析图例
常用的绑定框架有:JAXB、Castor、Jbind、Quick和Zeus等

分享到:
评论
2 楼 yunnick 2013-05-06  
pignut_wang 写道
顶一个,看了项目,似乎更新的比较慢,不知道楼主在实际使用中有没有遇到什么问题?

目前使用还算顺利,没有出什么问题,主要是结合xpath解析XML文件。
1 楼 pignut_wang 2013-04-25  
顶一个,看了项目,似乎更新的比较慢,不知道楼主在实际使用中有没有遇到什么问题?

相关推荐

    vtd-xml vtd-xml vtd-xml

    8. **源码开放**:VTD-XML是开源软件,遵循Apache 2.0许可证,开发者可以自由地查看、使用、修改和分发代码,促进了社区的贡献和改进。 总结起来,VTD-XML是一个强大的XML处理库,它的VTD数据结构和高效解析机制使...

    vtd-xml XML解析工具

    总的来说,VTD-XML是一种强大的XML解析解决方案,它通过独特的VTD技术为开发者提供了更高效、更节省资源的XML处理方式。无论是在大型企业系统还是在小型应用中,VTD-XML都能以其出色的性能和丰富的功能满足各种XML...

    VTD-XML技术解析XML实例

    在博客链接给出的资源中,`VTD-XML_intro.ppt`可能是关于VTD-XML技术的介绍性幻灯片,可能涵盖了技术的原理、优势、使用示例等内容。通过阅读这份资料,开发者可以获得更深入的理解,以便更好地在项目中应用VTD-XML...

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

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

    VTD-XML.zip_VTD_VTD-XML_instruction_zip

    然而,XML的解析和操作通常需要高效的工具,这就是VTD-XML的作用。 VTD-XML的核心特点是使用了Variable Length Token Descriptor (VTD)来表示XML文档,这种表示方式能够显著降低内存占用并提高处理速度。VTD是一个...

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

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

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

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

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

    VTD-XML库以其基于变量的文档定位(Variable To Document)技术而闻名,它提供了对XML文档的强大导航、解析和操作功能,且性能优于DOM和SAX解析器。 VTD-XML库的核心理念是通过预处理XML文档并创建一个索引,使得...

    vtd-xml源码+例程

    总的来说,"vtd-xml源码+例程"为开发者提供了一个深入研究XML处理技术的机会,不仅能够提升对XML解析原理的理解,还能帮助开发者掌握一种实用且高效的XML处理工具。无论是进行XML解析、操作还是生成,VTD-XML都能...

    vtd-xml example

    VTD-XML是一个高效、灵活且功能强大的XML处理库,由VTD-XML技术创始人Harold Abelson开发。它主要用于XML文档的随机访问、解析、导航和修改。VTD-XML利用一种叫做Variable Length Tokenized Index(可变长度标记化...

    vtd-xml相关资料.zip

    VTD-XML是一种高效、轻量级的XML解析技术,由XimpleWare公司开发,它在处理大型XML文档时表现出显著的优势,相比DOM和SAX解析方式,VTD-XML在速度和内存占用方面有着更优的表现。VTD(Virtual Token Descriptor)是...

    VTD-XML解析软件.zip

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

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

    ### 新兴XML处理方法VTD-XML介绍 #### 序言 随着XML(Extensible Markup Language,可扩展...随着XML技术在各行各业中的广泛应用,VTD-XML作为一种高效的XML处理工具,将会在未来的软件开发中发挥越来越重要的作用。

    vtd-xml-2.6-java-src.rar_VTD-XML_www.vtd2cn_断词

    VTD-XML 是一种基于 Java* 的新型开放源代码 XML 处理 API,能够解决当前 XML 处理模型的许多问题。此方案目前属于 Sourceforge* 一部分,可在此处*找到。通过本演示*,您将熟悉这些基本的概念。仅凭这一点,我们还...

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

    在项目`VTD-XML-Example-master`中,我们可以期待看到如何将VTD-XML与Volley集成的代码示例,包括XML数据的下载、解析和可能的数据处理。此外,可能还会有性能测试和对比分析,展示VTD-XML相对于其他解析器的优越性...

    vtd-xml解析实例

    自己写的Demo,对VTDNav、AutoPilot进一步进行封装,从而简化解析代码,仅供参考 上传后才发现上传的demo.xml错了,貌似无法重新上传,内容应该是 &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;DoubleData&gt;10.25...

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

    标题中的“使用VTD-XML的无模式C#-XML数据绑定”指的是在C#编程环境中,利用VTD-XML库实现的一种XML数据绑定技术,它允许开发者在没有XML架构(Schema)的情况下处理XML文档。VTD-XML库是一个高效且灵活的XML处理...

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

    VTD-XML是一种高效、轻量级的XML处理库,由XimpleWare公司开发并开源。这个库在XML处理领域独具特色,它结合了DOM、SAX和PULL...通过开源的方式,VTD-XML促进了XML技术的进一步发展,并且为社区带来了更多的可能性。

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

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

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

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

Global site tag (gtag.js) - Google Analytics