简介
常用开发中我们经常需要解析xml配置文件,所以在这里总结一下xml解析的几种方式。
什么是JAXP
JAXP(Java API for XMLProcessing,意为XML处理的Java API)是Java XML程序设计的应用程序接口之一,它提供解析和验证XML文档的能力。JAXP是在Java社区进程下开发的,包括JSR 5 (JAXP 1.0)和 JSR 63 (JAXP 1.1和1.2)两个规范。
JAXP解析XML的三种基本接口为:
- 文档对象模型解析接口或DOM接口
- XML简单API解析接口或SAX接口
- XML流API或StAX接口(是JDK 6的一部分,为JDK 5提供单独的包)
- 除了解析接口,JAXP还提供了XSLT接口用来对XML文档进行数据和结构的转换。
XML的解析方式对比
方式 | 实例 | 模型 | 原理 | 优缺点 | 复杂度 |
---|---|---|---|---|---|
Tree-based API | DOM JDOM DOM4j | 文档对象模型 | 将整个xml 加载内存中,形成文档对象树,所有对xml操作都对内存中文档对象进行 | DOM解析适合于对文件进行修改和随机存取的操作,但是不适合于大型文件的操作,Xml文件很大时会占用很大内存,速度慢 | 易于理解,易于开发 |
Event-based API | PUSH:SAX | 事件驱动型的XML解析方式 | 逐行扫描文档,一边扫描一边解析一边释放内存资源 ---- 不允许在内存中保留大规模xml 数据(Application被parser控制了-Observer模式) | 不用一次装载整个文件,遇到标签会触发一个事件,适合对XML的顺序访问,占用内存资源稍小,SAX只能读xml文件。速度比dom快,但仍不理想,Xml文件很大时,又不需要进行随机查找的时候,适合采用此方式 | 开发上比较复杂,需要用户自定义事件处理器,对开发人员更加灵活 |
Event-based API | PULL:StAX | 事件驱动型的XML解析方式 | 逐行扫描文档,一边扫描一边解析一边释放内存资源 ---- 不允许在内存中保留大规模xml 数据(Application控制了parser-Iterator模式) | StAX不但能读xml还能写xml。速度很快 | 开发上比较复杂,需要用户自定义事件处理器,对开发人员更加灵活 |
所以DOM解析适合于修改,SAX解析适合于读取大型文件,2者结合的话可以用JDOM
简要介绍XML的解析方式(DOM JDOM DOM4j SAX STAX)
一般来说,解析XML文件存在着两种方式,一种是Event-based API,比如说是SAX。另外一种就是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。这两种方式的区别:
Event-based API | 方式 | 模式 | 操作步骤 |
---|---|---|---|
SAX | XML 简单 API | 推push模式(由服务器为主导,向客户端主动发送数据( 推送 )) | 1.创建一个xmlParser。2.把application处理的xml注册到xmlParser。3.xmlParser遍历xmlFile,然后来调用application。(注意:这里用的是Observer的模式,就是接收到event的时候,去调用event的callback函数,xmlParser控制application) |
StAX | XML 流 API | 拉pull模式(由客户端为主导,主动向服务器申请数据( 轮询 )) | 1.创建一个xmlParser。2.xmlParser打开一个xmlFile。3.application调用这个xmlParser来获取xmlFile所得到的一系列event。(注意:这里用的Iterator模式,application控制xmlParser) |
如何选择
1.优先选择DOM方式(编程容易)
2.如果xml文件过大或者很多,优先使用StAX(比SAX快,强大,新)