XML是一种通用的数据交换格式,它的平台无关性、语言无关性、系统无关性、给数据集成与交互带来了极大的方便。XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已。
XML的解析有四种方式:
- DOM解析
- SAX解析
- JDOM解析
- DOM4J解析
其中前两种属于基础方法,是官方提供的平台无关的解析方式;后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于Java平台。
以一个xml文件为例
1 | <?xml version="1.0" encoding="UTF-8"?> |
一、DOM解析
DOM的全称是Document Object Model,也即文档对象模型。
在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。
- 优点:
- 形成了树结构,有助于更好的理解、掌握,且代码容易编写。
- 解析过程中,树结构保存在内存中,方便修改。
- 缺点:
- 由于文件是一次性读取,所以对内存的耗费比较大。
- 如果XML文件比较大,容易影响解析性能且可能会造成内存溢出。
1 | import java.io.IOException; |
DOM树所提供的随机访问方式给应用程序的开发带来了很大的灵活性,它可以任意地控制整个XML文档中的内容。然而,由于DOM分析器把整个XML文档转化成DOM树放在了内存中,因此,当文档比较大或者结构比较复杂时,对内存的需求就比较高。而且,对于结构复杂的树的遍历也是一项耗时的操作。所以,DOM分析器对机器性能的要求比较高,实现效率不十分理想。不过,由于DOM分析器所采用的树结构的思想与XML文档的结构相吻合,同时鉴于随机访问所带来的方便,因此,DOM分析器还是有很广泛的使用价值的。
二、SAX解析
SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。
- 优点
- 采用事件驱动模式,对内存耗费比较小。
- 适用于只处理XML文件中的数据
- 缺点
- 编码比较麻烦
- 很难同时访问XML文件中的多处不同数据
SAX不用将整个文档加载到内存,基于事件驱动的API(Observer模式),用户只需要注册自己感兴趣的事件即可。SAX提供EntityResolver, DTDHandler, ContentHandler, ErrorHandler接口,分别用于监听解析实体事件、DTD处理事件、正文处理事件和处理出错事件,与AWT类似,SAX还提供了一个对这4个接口默认的类DefaultHandler(这里的默认实现,其实就是一个空方法),一般只要继承DefaultHandler,重写自己感兴趣的事件即可。
示例代码:
1 | import java.io.IOException; |
三、JDOM解析
JDOM与DOM非常类似,它是处理XML的纯JAVA API,API大量使用了Collections类,且JDOM仅使用具体类而不使用接口。 JDOM 它自身不包含解析器。它通常使用 SAX2 解析器来解析和验证输入 XML 文档(尽管它还可以将以前构造的 DOM 表示作为输入)。它包含一些转换器以将 JDOM 表示输出成 SAX2 事件流、DOM 模型或 XML 文本文档
特点
- 使用具体类,而不是接口,使用时必须下载jar包
- API大量使用了Collections类
1 | import java.io.FileInputStream; |
四、DOM4J解析
dom4j是目前在xml解析方面是最优秀的(Hibernate、Sun的JAXM也都使用dom4j来解析XML),它合并了许多超出基本 XML 文档表示的功能,包括集成的 XPath 支持、XML Schema 支持以及用于大文档或流化文档的基于事件的处理
1 | import java.io.File; |
五、总结
在学习Spring的时候还看见一种解析方法叫jaxp,这些概念容易混淆,所以一定要明白他们之间的关系。
首先,SAX和DOM一个是两种XML文件解析的机制,它们是在JAVA中定义的接口
而JAXP、JDOM和DOM4J都是基于这两大核心API衍生出来的。
1、SAX与DOM
SAX与DOM都是底层API,它们在JDK中的路径分别是org.xml.sax与org.w3c.dom。
它们两个主要就是两种不同的解析方式,并没有具体的实现类。如果光有他们,你是完成不了对xml文档的处理的
2、JAXP
JAXP:(Java API for XML Processing)开发包是JavaSE的一部分,它由以下几个包及其子包组成:
- org.w3c.dom:提供DOM方式解析XML的标准接口
- org.xml.sax:提供SAX方式解析XML的标准接口
- javax.xml:提供了解析XML文档的类
我理解的,它是Java中自带的一个实现类,DOM或SAX都可以通过这个包来实现。比如最上面两个DOM和SAX的解析例子中,都用到了javax.xml包中的实现类。
3、JDOM与DOM4J
这两个包在使用的时候需要导入JAR包,说明是其他人开发出来的,也实现了SAX和DOM两种接口。
六、参考地址
http://www.cnblogs.com/longqingyang/p/5577937.html