xml解析⽅式与效率对⽐
⽅式模型原理说明1说明2
Tree-based API DOM  JDOM
DOM4j
把xml⽂件读⼊,变成DOM模型的⼀
棵树,然后查获取⾃⼰想要的东西
Xml⽂件很⼤时会占
⽤很⼤内存。
即速度慢,占⽤内存
Event-based API PUSH: SAX
Application被parser控制了
(Observer模式)
SAX只能读xml⽂
件。速度⽐dom快,
但仍不理想
Xml⽂件很⼤时,⼜
不需要进⾏随机查xml文件怎么打开
时候,适合采⽤此
⽅式
PULL:StAX
Application控制
了parser(Iterator模式)
SAX不但能读xml还
能写xml。速度很快
⼀般来说,解析XML⽂件存在着两种⽅式,⼀种是event-based API,⽐如说象SAX,XNI. 第⼆种是tree-based API,⽐如说DOM,JDOM,DOM4j等等. ⼀般来说,读取配置⽂件时,我们⼀般⽐较喜欢应⽤tree-based API这种⽅式,就是把xml⽂件读⼊,变成DOM形式的⼀棵树,然后进⾏查,获取⾃⼰说想要的东西. 但是,这种⽅式有个缺点,那就是如果你这个XML⽂件很⼤的话,你需要占⽤很⼤的内存.
所以对于很⼤的⼀个xml⽂件,⼜不需要进⾏随机查的时候,⽐较适合采⽤event-based API,那就是说他解析xml⽂件,如果是START_ELEMENT,那么他就调⽤startElement()的回调⽅法..他遍历过了就过了,不能再回去.
在event-based API中⼜存在两种⽅式: ⼀个是PUSH的⽅式,就⽐如说是SAX. 另外⼀种是PULL的⽅式,⽐如StAX.
怎么来理解PUSH和PULL的区别呢. 先假设有这么三个⾓⾊: application, xmlFile, xmlParser. 那么,如果我们采⽤PUSH的⽅式,步骤为:
1. 创建⼀个xmlParser.
2. 把我们的application处理xml的注册到xmlParser.
3. xmlParser遍历xmlFile,然后来调⽤application.
这⾥⾯,⽤的是Observer的模式,就是接收到event的时候,去调⽤event的callback函数, 这⾥⾯有个很不好的地⽅就是,你application反⽽是被Parser控制了.
于是,就出现了PULL⽅式的解析.
1. 创建⼀个xmlParser
2. xmlParser打开⼀个xmlFile
3. application调⽤这个xmlParser, 来获取xmlParser打开xmlFile所得到的⼀系列event.
这⾥,⽤到了Iterator的模式. 最主要的⼀点是: 这个时候application控制了xmlParser.
StAX有两种API,⼀种是cursor-based,⼀种是iterator-based. 这两种详细的⽐较参考:
这⾥,SAX和StAX的另外⼀点区别是: SAX只能读xml⽂件. StAX不但能读xml⽂件,⽽且还能写xml⽂件.
传统的处理XML的API有DOM和SAX两种,DOM速度慢,占⽤内存极⼤。SAX虽然⽐DOM快,但速度任不理想。现在,⼀种新的基于流的 Stream API for XML(简称 StAX)极⼤地提⾼了XML的处理速度,并且已经称为JSR 173标准()。⽬前,StAX最好的开源实现是Woodstox(),它完整地⽀持StAX API。Resin3.1也内置了StAX的实现,但是并没有⽀持所以的StAX API。XFire在ClassPath上如果到了StAX API的定义,就会试图定位⼀个StAX的实现。