APP下载

Java解析XML的方法比较研究

2009-08-19陈小毛汤文兵

中国新技术新产品 2009年15期

陈小毛 汤文兵

摘要:XML应用日益广泛,正确高效地解析XML文件的数据信息日显重要。Java解析XML的方法有多种,主流方法有DOM、SAX、JDOM、DOM4J。本文分析了这些方法的优劣,给出了最基本的解析XML的示例Java程序。在实际应用中,可以根据各种解析方法的特点选择。

关键词:JAVA;XML;DOM;SAX;JDOM;DOM4J

1 引言

随着Web的广泛应用,XML已成为互联网上主要数据交换标准之一,正确高效地解析XML文件的数据信息日显重要。在Java中主要有四种解析XML的方法:DOM、SAX、JDOM和DOM4J,它们各有特点。通过比较,可以在应用中更加合理地选择它们。

2 DOM解析XML文档

DOM(文档对象模型)是W3C制定的一套标准接口,独立于语言平台的,提供了构成DOM的不同对象的定义,却没有提供特定的实现[1]。实际上,任何编程语言都能够实现,而不仅限于Java。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。其次,它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。

2.1 DOM 设计的局限性

语言独立。DOM 并不是用人们心目中的 Java 语言设计的。虽然这种方法保留了在不同语言中非常相似的API,它也使那些习惯 Java 语言的程序员感到更麻烦。例如:Java 语言内建了一种 String 类,而 DOM 则规范定义了自己的 Text 类。

严格的层次结构。DOM API 直接沿袭了 XML 规范。在 XML 中,每件东西都是一个结点,因此能在 DOM 中找到一个几乎每件东西都可以扩展的基于 Node 的接口和返回 Node 的一系列方法。就多态性的观点来讲,它是优秀的,但鉴于如上解释,它在 Java 语言中的应用是困难而且不便的,其中从 Node 向叶类型作显式下拉会导致代码的冗长和难以理解。

接口驱动。公共 DOM API 仅由接口组成(Exception 类是个例外)。W3C对提供实现并不感兴趣,它只对定义接口感兴趣。但它也意味着作为 Java 程序员使用 API 在创建 XML 对象时增加了分散程度,因为W3C标准大量使用工厂化的类和类似的灵活的但不直接的模式。在某些应用中,XML文档是仅由语法分析器建立的,而从不会由应用程序级代码建立,这是不相关的。但随着 XML 更广泛的使用,并不是所有问题都继续需要由语法分析器来驱动。应用程序的开发人员需要一个更方便的方法有计划地构造 XML 对象。

2.2 DOM解析XML示例

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = factory.newDocumentBuilder();

Document doc = builder.parse(new File("sample.xml"));

3 SAX解析XML文档

SAX(XML简单应用程序接口)是一个公共的基于事件的XML文档解析标准[2]。SAX提供了一种对XML文档进行顺序访问的模式,这是一种快速读写XML数据的方式。当使用SAX解析器对XML文档进行解析时,会触发一系列的事件,并激活相应的事件处理函数,从而完成对XML文档的访问,所以SAX接口也被称作事件驱动接口。

与DOM比较而言,SAX是一种轻量型的方法。在处理DOM的时候,需要读入整个XML文档,再在内存中创建DOM树,生成DOM树上的每个Node对象。当文档比较小的时候,这不会造成什么问题,但是一旦文档大起来,处理DOM就会变得相当费时费力。特别是其对于内存的需求,也将是成倍的增长,以至于在某些应用中使用DOM是一件很不划算的事(如在Applet中)。这时候,一个较好的替代解决方法就是SAX。

SAX解析XML示例

SAXParserFactory factory = SAXParserFactory.newInstance();

SAXParser parser = factory.newSAXParser();

XMLReader reader = parser.getXMLReader();

reader.setContentHandler(defaultHandle);

reader.parse(new InputSource(new FileReader("sample.xml")));

其中,defaultHandle就是实现了ContentHandler事件处理接口类的一个对象。

4 JDOM解析XML文档

JDOM是一种使用 XML 的独特 Java 工具包,用于快速开发 XML 应用程序。它的设计包含 Java 语言的语法乃至语义。JDOM的目的是成为Java特定的文档模型。它简化与XML的交互,并且比使用DOM实现更快。由于它遵循Pareto 法则,大大简化了API[3]。

JDOM 自身不包含解析器。它通常使用 SAX2 解析器来解析和验证输入 XML 文档。它包含一些转换器以将 JDOM 表示输出成 SAX2 事件流、DOM 模型或 XML 文本文档。

JDOM 与 DOM 主要有两方面不同。首先,JDOM 仅使用具体类而不使用接口,这在某些方面简化了 API,但也限制了灵活性。其次,API 大量使用了集合类,简化了那些已经熟悉这些类的 Java 开发者的使用。

JDOM解析XML示例

JDOM可以基于DOM或SAX方式解析XML,代码如下:

DOMBuilder builder = new DOMBuilder();

Document doc = builder.build(new File("jdom.xml"));或

SAXBuilder builder = new SAXBuilder();

Document doc = builder.build(url);

5 DOM4J解析XML文档

虽然DOM4J代表了完全独立的开发结果,但最初它是 JDOM 的一种智能分支。它合并了许多超出基本 XML 文档表示的功能,包括集成的 XPath 支持、XML Schema 支持以及用于大文档或流化文档的基于事件的处理[4]。它还提供了构建文档表示的选项,它通过DOM4J API 和标准 DOM 接口,具有并行访问功能。

为支持这些功能,DOM4J使用接口和抽象基本类方法。DOM4J大量使用了API中的集合类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是它提供了比JDOM大得多的灵活性。

在添加灵活性、XPath集成和对大文档处理的目标时,DOM4J的目标与JDOM是一样的:针对Java开发者的易用性和直观操作。它还致力于成为比 JDOM更完整的解决方案,实现在本质上处理所有Java/XML问题的目标。在完成该目标时,它比JDOM更少强调防止不正确的应用程序行为。

DOM4J是一个非常优秀的Java XML API,具有性能优异、功能强大和易用的特点,同时也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写 XML,特别值得一提的是连Sun的JAXM也在用DOM4J。

DOM4J解析XML示例

DOM4J也可以用DOM或SAX方式解析XML,示例代码如下:

SAXReader reader = new SAXReader();

Document doc = reader.read(xmlFile);或

DocumentBuilderFactory factory = DocumentBuilderFactory.newDocumentBuilder();

DocumentBuilder builder = factory.newDocumentBuilder();

org.w3c.dom.Document document = builder.parse(xmlFile);

DOMReader reader = new DOMReader();

org.dom4j.Document doc = reader.read(document);

6 结束语

DOM和SAX解析方法具有通用性,但并不是特别为Java语言设计的。DOM一次性将XML文件完全读入内存,适用于小体积的XML文件。SAX则基于事件,对于体积较大的XML更能体现出优越性。

JDOM与DOM4J都是为Java特别设计的,基于DOM或SAX。JDOM简化了API,对于常用的XML处理相当简洁。DOM4J十分灵活,适用于工具或框架创建者等。

在实际应用中,可以灵活地选择其中一种,或几种方法组合起来使用,以发挥各种方法的优点。

参考文献

[1]张银鹤,冉小,刘制国等.JSP完全自学手册[M].北京:清华大学出版社,2008

[2]张迪,朱敏,张凌立.基于SAX的XML解析与应用[J].计算机与数字工程,2008,第7期:103~106

[3]用JDOM简化XML编程. http://www.ibm.com/developerworks/cn/java/j-jdom/

[4] DOM4J. http://www.dom4j.org/

作者简介:陈小毛(1983-),女,硕士研究生,研究方向:计算机控制。

汤文兵(1967-),男,副教授,硕士研究生导师,研究方向:计算机控制。