新兴XML处理方法VTD-XML介绍
来源:互联网 发布时间:2008-09-04 14:42:00
序言
本文所提及的VTD-XML并非本文作者原创,作者只是对它进行介绍。
问题
通常当我们提起XML的使用时,最头痛的部分便是XML的verbosity与XML的解析速度,当需要处理大XML文件时这个问题便变得格外严重。我在这里提及的,便是如何优化XML处理速度的话题。
当我们选择处理XML文件的时候,我们大致上有两种选择:
DOM,这是W3C的标准模型,它将XML的结构信息以树形的方式构建,提供了遍历这颗树的接口与方法。
SAX,一种低级的parser,逐元素的向前只读处理,不含有结构信息。
以上两种选择都各有利弊,但是都不是特别好的解决方案,它们的优缺点如下:
DOM
优点:易用性强,因为所有的XML结构信息都存在于内存中,并且遍历简单,支持XPath。
缺点:Parsing速度太慢,内存占用过高(原文件的5x~10x),对于大文件来说几乎不可能使用。
SAX
优点:Parsing速度快,内存占用不与XML的大小相联系(可以做到XML涨内存不涨)。
缺点:易用性差,因为没有结构信息,并且无法遍历,不支持XPath。如果需要结构的话只能读一点构造一点,这样的可维护性特别的差。
我们可以看出,基本上DOM与SAX是正好相反的两个极端,但是任何一个都不能很好的满足我们的大部分要求,我们需要找出另外一种处理方法来。注意XML的效率问题并不是XML本身的问题,而是处理XML的Parser的问题,就像我们在上面看到的两种方法有不同的效率权衡一样。
思考
我们很喜欢类似DOM的使用方法,因为我们可以遍历,这意味着可以支持XPath,大大增强了易用性,但是DOM的效率很低。就像我们已经知道,效率问题出在处理机制上。那么,DOM到底有哪些方面影响了它的效率呢?下面让我们来做一个全面的解剖:
在当今大多数基于虚拟机(托管,或任何类似机制)技术的平台下,对象的创建销毁是一个耗时的作业(这里值得主要是Garbage Collection的耗时),DOM机制中所运用的大量的对象创建销毁无疑是影响其效率的原因之一(会引发过多的Garbage Collection)。
每个对象都会额外有32bits用来存储它的内存地址,当像DOM一样拥有大量对象的时候这个额外开支也是不小的。
引起以上两个问题的最主要的效率问题在于,DOM与SAX都是extractive parsing模式,这种解析模式注定了DOM与SAX都需要大量的创建(销毁)对象,引起效率问题。所谓的extractive parsing就是说在解析XML时,DOM或SAX会提取一部分原文件(一般来说是一个字符串),然后在内存中进行解析构建(输出自然就是一个或一些对象了)。拿DOM这个例子来说,DOM会将每一个element, attribute, processing-instruction, comment等等都解析成对象并给与结构,这就是所谓的extractive parsing。
由extractive的问题带来的另一个问题便是更新效率,在DOM中(SAX因为不支持更新所以根本不提它),每一次需要做改动时,我们要做的就是将对象的信息再解析回XML的字符串,注意这个解析是个完整的解析,也就是说,原文件并没有被利用,而是直接将DOM模型重新完整解析成XML字符串。换句话讲,也就是DOM并不支持Incremental Update(增量更新)。
另一个很可能不被注意到的“小”问题便是XML的编码,无论是何种解析方法都需要能够处理XML的编码,也就是说,在读取的时候解码,在写入的时候编码。DOM的另一个效率问题便是当我对于一个大XML只想做很小的一块儿修改的时候它也必须首先将整个文件进行解码,然后构建结构。无形中又是一个开销。
让我们来总结一下问题,简单的讲DOM的效率问题主要出在它的extractive parsing模式上(SAX也是一样,有同样的问题),由此引发了一系列相关问题,如果可以击破这些效率瓶颈的话那么可以想象XML的处理效率将进一步的得到提高。如果XML的易用性与处理效率得到飞跃性的提高的话,那么XML的应用范围,应用模式将得到更一步的升华,或许由此可以产生出许许多多精彩的以前连想都没有想过的基于XML的产品来。


猜你喜欢
- 介绍可以针对分区表的每个分区指定各自的存储路径,对于innodb存储引擎的表只能指定数据路径,因为数据和索引是存储在一个文件当中,对于MYI
- 简介在廖雪峰的python网站上,他是这么说的python是动态语言,它允许程序在执行过程中动态绑定属性或者方法(使用MethodTpye)
- 本文实例讲述了php中正则替换函数ereg_replace用法。分享给大家供大家参考。具体如下:下面的实例是利用php 正则替换函数 ere
- 其实锁这种东西,都能能不加就不加,锁会导致程序一定程度上退回到串行化,进而降低效率。案例首先,看一个案例,如果要实现一个计数器,并且是多个协
- 常用Mysql查询语句记录一、授权1.授权本地用户对所有数据库具有所有权限> grant all privileges on
- 一、算法简要我们希望有这么一种函数:接受输入然后预测出类别,这样用于分类。这里,用到了数学中的sigmoid函数,sigmoid函数的具体表
- group_concat()函数的参数是可以直接使用order by排序的。666。。下面通过例子来说明,首先看下面的t1表。比如,我们要查
- python绘制横向水平柱状条形图Bar,供大家参考,具体内容如下import matplotlibimport randomimport
- <%'该函数作用:按指定参数格式化显示时间。'numformat=1:将时间转化为yyyy-mm-dd h
- 最近学习了python基础,写一下3大排序练练手:'''Created on 2013-8-23@author: c
- 作用域为已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围。Go 语言中变量可以在三个地方声明:函数内定义的变量称为局部变量
- 暂且放下你的编程语言来瞻仰下我所见过的最棒的标准库。为项目选择编程语言和挑选你最爱的球队不一样。应该从实用主义出发,根据特定的工作选择合适的
- <?php $fp = fopen("http://www.***.com/**
- 解决办法: 1.新建一个同名的数据库(数据文件与原来的要一致) 2.再停掉sql server(注意不要分离数据库) 3.用原数据库的数据文
- 实验环境:tensorflow版本1.2.0,python2.7介绍关于空洞卷积的理论可以查看以下链接,这里我们不详细讲理论:1.Long
- 到目前为止,我已经开发了两个HTML编辑器了,一个用在公司的CMS项目,另一个用在这个Blog(TidyEditor,暂时没有单独发布)。下
- 比如:现需要向学生表中插入新的学生数据。但在插入学生数据的时,需要同时检查老师表里的数据。如果插入学生的老师不在老师表里,则先向老师表中插入
- 本文实例讲述了Flask框架学习笔记之消息提示与异常处理操作。分享给大家供大家参考,具体如下:flask通过flash方法来显示提示消息:f
- 先看一个示例代码如下<template> <div align="center" styl
- 前提:因为本文主要围绕着在thinkPHP5中使用redis的,所以关于redis的安装就不特意说明了,不过在这稍微提醒一下,安装完redi