11.1 dom4j简介
dom4j是一套开源的XML解析工具,完全支持DOM、SAX和JAXP机制。与传统的Xerces-J相比,dom4j更为简单易用,因此实际项目中往往选择dom4j作为XML解析器。
与Xerces不同的是,dom4j没有提供其他语言版本,只提供了Java语言版本,因此dom4j主要在Java应用中作为XML解析工具。
11.1.1 dom4j的封装和优势
dom4j在很大程度上简化了XML的处理方式。从表面上看,dom4j有点类似于DOM解析机制,也将XML文档转换为一棵结构化树(后面我们把这棵树称为dom4j树),但dom4j树的处理方式比DOM树更简单。
使用Xerces-J的DOM实现来解析XML文档时,对于如下XML文档片段:
在获取<list…/>节点之后,如果希望获取它所包含的3个子节点里的数据,需要使用如下代码:
这种处理方式总感觉非常奇怪:list元素的getChildNodes()方法返回该元素的所有子节点,而不是所有子元素(注意节点和元素的区别),这使得程序在处理这种解析方式时异常烦琐。
如果换了dom4j来处理上面的XML文档,情况就不同了,dom4j的处理方式更接近平常的自然思维,dom4j对上面的XML文档的处理方式是:
从上面的代码不难看出,虽然dom4j解析和DOM解析的思想基本相似,但dom4j的处理方式更简单。
相对于传统的Xerces-J的实现而言,dom4j最大的特点就是简单。除此之外,dom4j还有如下两个优势:
面向接口编程
dom4j采用面向接口编程的方式来处理XML文档解析,应用程序主要面向Document、Element和ProcessingInstruction等接口编程,至于这些接口的底层实现,程序员无须关心。
由于dom4j采用了面向接口方式编程,因此程序在处理XML解析时更加灵活。而且由于dom4j实质上是以其他XML解析器为基础的,采用面向接口编程的方式将允许dom4j的底层在不同的解析机制之间自由切换。
支持多种解析机制
dom4j对底层原始的XML解析器进行了高度封装,正是这种封装简化了XML处理。在dom4j的org.dom4j.io包下提供了如下几个类:
DOMReader:它负责根据W3C的DOM树创建dom4j树。
SAXReader:它基于SAX解析机制来解析一份XML文档,并将其转换为dom4j树。
XPP3Reader:其底层需要依赖于XML Pull Parser 3.x来解析XML文档,并将其转换为dom4j树。
XPPReader:它是基于XML Pull Parser 2.x的解析器,目前不支持注释、CDATA和处理指令。
由于dom4j如此优秀,因此很多优秀的开源Java项目都采用dom4j作为XML解析器,例如Hibernate框架。实际上,笔者在实际项目开发中,也往往会优先考虑使用dom4j作为XML解析器。
提示
与dom4j对应的还有另外一个非常简单易用的XML解析器,名为JDOM,但在网络上的一些公开评测中,dom4j的性能比JDOM略高。
11.1.2 下载和安装dom4j
下载和安装dom4j请按如下步骤进行:
(1)登录dom4j的官方站点http://www.dom4j.org/下载其最新版。笔者成书之时,dom4j的最新版本是1.6.1,建议读者也下载该版本。
(2)下载完成将得到dom4j-1.6.1.zip文件,将其解压缩可得到如下目录结构:
docs:该目录下存放了dom4j的说明文件和API文档。
lib:该目录下存放了dom4j编译和运行所依赖的第三方类库。
src:该目录下存放了dom4j项目的所有源文件。
xdocs:该目录下也存放了dom4j的一些相关文档,只是这些文档都是XML格式的。
xml:该目录下存放了dom4j所提供的一些简单的范例XML文档。
dom4j-1.6.1.jar:dom4j的核心JAR包。
相关杂项文档。
(3)在Java项目中使用dom4j非常简单,我们可以将dom4j-1.6.1.jar添加到系统的CLASSPATH环境变量中。如果使用Ant工具,则只要让项目在编译和运行时可以引用到该JAR即可;如果使用Eclipse等IDE工具,则只要通过Build Path引用到该JAR即可。