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文件及其对应的文件流格式。

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

1.1.2拉式解析(StAX)

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

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

1.2 面向文档的对象式解析

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

DOM的层次化对象模型是一个树形结构,它将一个XML文档看作一棵节点树,每个节点代表一个XML文档中的元素。

DOM的有点在于可以随机访问,但由于DOM在使用数据前需要完整的遍历XML文档,在内存中构建树形结构表示,因此需要消耗大量的内存,尤其是对于大型文档,性能下降的很快。

下图表示了Xml文件预期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目前所支持的所有元素的类型(12种):

查询与更新:如果需要提取XML内容,就查找VTD数组,利用VTD记录中的位置等信息在原始比特数组上进行解码并返回字符串。

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

下图是三种主要的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.

Java代码 收藏代码

/* 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("\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文件:

Hurry,my lawn is going wild!

Lawnmower

148.95

Confirm this is electric

Baby Monitor

1

39.98

1999-05-21

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

Hurry,0)">

Baby Monitor

1

200

1999-05-21

第四部分:其他解析方式

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

面向文档的解析技术对主要关心文档的XML结构的应用程序来说是适用的,但是有很多应用程序仅仅将XML作为数据交换的媒介,它们更关心的是文档数据本身,而面向应用的对象式解析技术更适用。

面向应用的对象式解析技术又称为为XML数据绑定,指将数据从一些存储媒介(如XML文档、文本文件和数据库)中取出,并通过应用程序表示这些数据的过程,即把数据绑定到虚拟机能够理解并且可以操作的某种内存中的结构。

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

java vtd-xml_XML解析技术之VTD-XML 简介及代码实例相关推荐

  1. 关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用

    转载:http://blog.csdn.net/5iasp/article/details/37054171 谢谢博主 ======================================== ...

  2. java实现分发_关于JAVA中事件分发和监听机制实现的代码实例

    [实例简介] 关于JAVA中事件分发和监听机制实现的代码实例,绝对实用代码,有说明. [实例截图] [核心代码] JavaEventDispatch ├── bin │   └── com │   └ ...

  3. cpu java poi 导出_java基于poi导出excel透视表代码实例

    这篇文章主要介绍了java基于poi导出excel透视表代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 从前,我是一个前端程序猿,怀着对打通 ...

  4. java 控制台输出时间_Java获取时间打印到控制台代码实例

    这篇文章主要介绍了Java获取时间打印到控制台代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 面试时有一道面试题:要求获取当时时间,并像电子 ...

  5. java自动生成生成java透视表_java基于poi导出excel透视表代码实例

    这篇文章主要介绍了java基于poi导出excel透视表代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 从前,我是一个前端程序猿,怀着对打通 ...

  6. java excel 透视_java基于poi导出excel透视表代码实例

    这篇文章主要介绍了java基于poi导出excel透视表代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 从前,我是一个前端程序猿,怀着对打通 ...

  7. java nginx 例子_Java及nginx实现文件权限控制代码实例

    我们知道,使用nginx作为文件下载服务器,可以极大地降低对后端Java服务器的负载冲击,但是nginx本身并不提供授权控制,因此好的方案是由后端服务器实现权限控制,最好的方式是直接复用应用的认证体系 ...

  8. java timer demo_java中任务调度java.util.Timer,ScheduledExecutor,Quartz的机制说明和demo代码实例分享...

    目前的 Web 应用,多数应用都具备任务调度的功能.这里就简单的介绍任务调度的Java 实现方法,主要包括 Timer,Scheduler, Quartz 以及 JCron Tab,目的在于给需要开发 ...

  9. Java计算文章多少字_java计算中文字数的代码实例

    这篇文章主要介绍了java统计汉字字数的方法,结合实例形式分析了java正则判定.字符串遍历及统计相关操作技巧,需要的朋友可以参考下 本文实例讲述了java统计汉字字数的方法.分享给大家供大家参考,具 ...

  10. java实现多线程抢单_Java模拟多线程实现抢票代码实例

    这篇文章主要介绍了Java模拟多线程实现抢票,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 实现100张票抢购的demo 这里需要一个变量,来保存1 ...

最新文章

  1. redis缓存穿透,缓存击穿,缓存雪崩
  2. wpf listview 添加控件_WPF开源控件扩展库 MaterialDesignExtensions
  3. Silverlight 3.0 Beta版 正式发布
  4. “从客户端中检测到有潜在危险的 Request.Form 值“的解决方案汇总
  5. 各种安卓对话框代码合集
  6. Airbnb欺诈预测机器学习模型设计:准确率和召回率的故事 发表于2015-07-15 16:14| 3926次阅读| 来源AirBNB/Data| 1 条评论| 作者Ariana Radianto
  7. Java学习小程序(10)三个等级的才字母游戏
  8. 也说翟鸿燊忽悠的一面
  9. zookeeper开机自启动
  10. 面试必备的分布式事物方案
  11. java的头怎么写_JAVA对象布局之对象头(Object Header)
  12. [转载] java中对数组进行排序_如何在Java中对数组排序
  13. 二叉树 -- 5.1.1 Binary Tree Level Order Traversal -2 -- 图解
  14. 关于CSS的fixed定位
  15. 64位 java 数据类型_java 数据类型
  16. 炫酷文字消失动画网站404页面源码
  17. java学生成绩管理系统类图,学生成绩管理系统的用例类图.ppt
  18. 【转】用winpcap实现局域网DNS欺骗之一(基础知识)
  19. 用Vue.js开发企业管理后台,我做到了
  20. Python pandas练习Retuns50stocks股票,纯英文ipynb作业20题,100%正确答案

热门文章

  1. java俄罗斯方块代码_俄罗斯方块java源代码提供
  2. Webservice工具soapUI下载和使用
  3. 成年人の内部 福利 不敢高调分享……
  4. 射频电子电路设计图集---研读
  5. 解读核磁共振射频系统架构、模块结构及功能介绍
  6. 《微型计算机原理及应用》复习整理(针对考点)
  7. MSN Messenger
  8. 百度文库免费下载,精选六种方法!
  9. 小白安装linux系统一键,小白如何快速安装vos3000,一键快速安装VOS
  10. c语言学生综合测评系统_学生综合评价系统