自学材料 VTD-XML学习简介
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.1.2拉式解析(StAX)
在这种解析方式中,应用程序控制着读循环。反复调用解析 器获得下一个事件,直到文档结束。 StAX针对同样的XML文档所获得事件类型和SAX基本相同。
1.2 面向文档的对象式解析
DOM(Document Object Model)是用与平台和语言无关的方式 对XML文档进行建模的官方W3C标准 。
DOM的层次化对象模型是一个树形结构,它将一个XML文档 看作一棵节点树,每个节点代表一个XML文档中的元素。 DOM的有点在于可以随机访问,但由于DOM在使用数据前需 注:元素内的空格或回车也会被当作 要完整的遍历XML文档,在内存中构建树形结构表示,因此需要 文本对象 消耗大量的内存,尤其是对于大型文档,性能下降的很快。
VTD(Virtual Token Descriptor,虚拟令牌描述符)结构:
VTD是一个64bits定长的数值类型,记录了每个元素的起始位置 (offset),长度(length),深度(depth)以及令牌(元素标签) 的类型(type)等信息。
Type value 0 1 2 3 4 5 6
面向应用的对象式解析技术又称为为XML数据绑定,指将数据 从一些存储媒介(如XML文档、文本文件和数据库)中取出,并通过 应用程序表示这些数据的过程,即把数据绑定到虚拟机能够理解 并且可以操作的某种内存中的结构。 数据绑定并不是一个新鲜的概念,其在关系数据库上早已得到 了广泛的应用,如Hibernate就是针对数据库的轻量级数据绑定框 架。
TOKEN_PI_NAME
TOKEN_PI_VAL TOKEN_DEC_ATTR_NAME TOKEN_DEC_ATTR_VAL
11 12
XML <?xml version="1.0" ?> declaration proper ty value CDATA value <![CDATA[…data content…]]> DOCTYPE <!DOCTYPE …>
VTD-XML
DOM
SAX/PULL
处理模型
非提取的基于文件指针的模 提取式的内存对象 提取式基于数据流模 树模式 式 式
性能
最快(比不进行任何逻辑处 理的SAX方式还快) xml文件的1.3-1.5倍 可以
最慢
第二快
内存wk.baidu.com用 随机存取
xml文件的5-10倍 可以
不随文件大小变化 不可以
增量更新
可以
7
8 9 10
Processing <?target street="mission" ?> Instruction name
Processing Instruction value XML declaration property name <?target street="mission" ?> <?xml version="1.0" ?>
TOKEN_CDATA_VAL TOKEN_DTD_VAL
查询与更新: 如果需要提取XML内容,就查找VTD数组,利用VTD记录中的 位置等信息在原始比特数组上进行解码并返回字符串。 而且VTD-XML还可以高效的实现增量更新,例如,如果想在一 个大型XML文档中找出一个节点元素并删除它,那么只需要找 到这个元素的VTD,将这个VTD从VTD数组中删除,然后再利 用所有的VTD写出到另一个二进制数组中就可以了,这就是所 谓增量更新。这个过程实际上就是一个二进制数组的拷贝过程, 其效率是非常高的。
<example attrName1="this">
<ns:example xmlns:ns="google"> TOKEN_ATTR_NS <example property2="that"> <example>tasty fruit </example> <!-- this is a comment --> TOKEN_ATTR_VAL TOKEN_CHARACTER_DATA TOKEN_COMMENT
不可以
不可以
重复解析
不需要
需要
需要
第三部分:应用实例
VTD-XML解析xml通常经过以下几步:
1.以一个byte数组开始(存放xml); 2.利用VTDGen进行解析; 3. 利用VTDNav进行导航定位; 4. 节点遍历使用Autopilot; 5. 利用Xpath进行节点选择
6. 增量更新使用XMLModifier
Type Name Start Tag End Tag Attribute Name Name Space Attribute Value Character Data Comment <example> </example>
Example
Variable Name TOKEN_STARTING_TAG TOKEN_ENDING_TAG TOKEN_ATTR_NAME
XML解析技术 之 VTD-XML 简介及代码实例
目录:
第一部分:XML解析技术简介 第二部分: VTD-XML基本原理介绍 第三部分:应用实例 第四部分:工程应用改进
第一部分:XML解析技术简介
XML(eXtensible Markup Language,可扩展标记语言)是由 World Wide Web联盟(W3C)定义的元语言,即一种关于语言的 语言。 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数组上进 行解码并返回字符串。
1.1.1推式解析(SAX)
在这种解析方式中,解析器控制着读循环,在文档结束之前 控制权不会返回给应用程序。
SAX是基于事件驱动的,即SAX解析器在读取XML文档的过 程中生成一个事件流,并且对于每个事件通过回调事件处理程 序中相应的方法来进行处理。比如元素开始和结束标记,元素 内容,实体,语法分析错误等事件。
实例一:获取某一命名空间下的所有元素及其文本值 实例二:增量更新,去除某些节点,更新节点属性值
官网地址:http://vtd-xml.sourceforge.net/
第四部分:工程应用改进
前面所谈到的三种解析技术都是面向文档的,还有第四种解析 技术:面向应用的对象式解析技术。
面向文档的解析技术对主要关心文档的XML结构的应用程序来 说是适用的,但是有很多应用程序仅仅将XML作为数据交换的媒 介,它们更关心的是文档数据本身,而面向应用的对象式解析技术 更适用。
常用的绑定框架有:JAXB、Castor、Jbind、Quick和Zeus等
CMS与EPG的内容同步接口,涉及到xml的内容绑定,使用第 四种框架更合适,只是暂时没有找到与内容XML相匹配的解决 方案,还在进一步学习中。
参考:
http://www.blogjava.net/orangelizq/archive/2009/07/19/287330.html http://www.cnblogs.com/cavingdeep/archive/2006/03/15/350456.html
1.3 面向文档的指针式解析
面向文档的流式解析效率较高,但易用性差,而对象式 解析易用性强,却效率较低。 这两种方式都是提取式解析(extractive parsing)。 拿DOM这个例子来说,DOM会将每一个element, attribute等都在内存中解析成对象并给与一定结构。 更新 效率问题:这种解析模式注定了需要大量的创建和 销毁对象(GC问题),在DOM中(SAX并不支持更新),每 一次改动都需要将DOM模型重新完整的解析成XML字符串 ,原文件并没有被利用,即DOM并不支持增量更新。为了 解决这些问题,提出了一种较新颖的指针式解析技术,即 VTD-XML。
1.1 面向文档的流式解析
流式解析是解析器顺序读取XML文档,捕获的各种事件,如 元素开始和元素结束等,交由程序处理。
流式解析又分为两种解析方式: 1.推式解析(SAX:Simple API for XML) 2.拉式解析(StAX:Streaming API for XML) 这两种方式的主要区别在于是由解析器还是应用程序控制读 循环(读入文件的循环)
XML解析技术的分类 根据从XML中获取数据的简易性,性能和最终所得到的数 据模型的不同,XML解析技术大致可分为以下四类: 1.面向文档的流式解析; 2.面向文档的对象式解析; 3.面向文档的指针式解析; 4.面向应用的对象式解析; 这四类解析技术分别处于不同的抽象层次,适用于不同的应 用场景, 针对具体的应用需求,选择合适的解析技术,往往能 够减少内存消耗,缩短处理时间,更方便地获取数据,提高应 用系统的整体性能。