文档模型 DOM JDOM dom4j Electric xml XML Pull Parser 测试具体信息 性能比较 文档时间 文档遍历时间 文档修改时间 文本生成时间 文档内存大小 java 序列化 结束语 后续内容... 参考资料 关于作者 对本文的评价
相关内容:
教程:Understanding SAX 教程:Understanding DOM 教程:XML PRogramming in Java
另外在 Web 服务专区:
教程 工具和产品 文章
研究 Java 中 XML 文档模型的特性和性能 Dennis M. Sosnoski(dms@sosnoski.com) 总裁,Sosnoski Software Solutions, Inc. 2001 年 9 月
在本文中,Java 顾问 Dennis Sosnoski 比较几个 Java 文档模型的性能和功能。当选择模型时,无法做到每次都权衡得很清楚,假如以后改变主意,则需要大量编码来进行切换。作者将性能结果放入特性集合的上下文中并遵循标准,对所要求的正确选择给出了一些建议。本文包含用于这组测试的几张图表和源代码。 使用内存中 XML 文档的 Java 开发者可以选择使用标准 DOM 表示或几个 Java 特定模型中的任何一个。该灵活性已经帮助将 Java 建立成 XML 工作的出色平台。但是,由于不同模型数量的增加,已经更加难以确定如何比较模型的功能、性能和易用性。
关于使用“Java 中的 XML”系列中的第一篇文章研究了 Java 中一些领先的 XML 文档模型的特性和性能。它包括一组性能测试的结果(带有可下载的测试代码,请参阅参考资料)。在系列中的第二篇文章将通过比较为实现同样任务所使用的不同模型的样本代码来研究易用性问题。
JDOM 文档声明其目的是“使用 20%(或更少)的精力解决 80%(或更多)Java/XML 问题”(根据学习曲线假定为 20%)。JDOM 对于大多数 Java/XML 应用程序来说当然是有用的,并且大多数开发者发现 API 比 DOM 轻易理解得多。JDOM 还包括对程序行为的相当广泛检查以防止用户做任何在 XML 中无意义的事。然而,它仍需要您充分理解 XML 以便做一些超出基本的工作(或者甚至理解某些情况下的错误)。这也许是比学习 DOM 或 JDOM 接口都更有意义的工作。
JDOM 自身不包含解析器。它通常使用 SAX2 解析器来解析和验证输入 XML 文档(尽管它还可以将以前构造的 DOM 表示作为输入)。它包含一些转换器以将 JDOM 表示输出成 SAX2 事件流、DOM 模型或 XML 文本文档。JDOM 是在 Apache 许可证变体下发布的开放源码。用于性能比较的版本是 JDOM Beta 0.7(jar 文件大小是 0.1MB)它带有用于从文本文件构建 JDOM 表示的 Crimson SAX2 解析器。
dom4j 虽然 dom4j 代表了完全独立的开发结果,但最初,它是 JDOM 的一种智能分支。它合并了许多超出基本 XML 文档表示的功能,包括集成的 XPath 支持、XML Schema 支持(当前为 alpha 格式)以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,它通过 dom4j API 和标准 DOM 接口具有并行访问功能。从 2000 下半年开始,它就一直处于开发之中,保留了最近发行版之间的现有 API。
为支持所有这些功能,dom4j 使用接口和抽象基本类方法。dom4j 大量使用了 API 中的 Collections 类,但是在许多情况下,它还提供一些替代方法以答应更好的性能或更直接的编码方法。直接好处是,虽然 dom4j 付出了更复杂的 API 的代价,但是它提供了比 JDOM 大得多的灵活性。
Electric XML Electric XML(EXML)是支持分布式计算的商业项目的附属产物。它与目前为止讨论的其它模型的不同之处在于,它只能适当地支持 XML 文档的子集,它没有为验证提供任何支持并且有更严格的许可证。然而,EXML 的优势是大小很小并提供了对 XPath 子集的直接支持,因为在最近几篇文章中已经将它提升其它模型的替代模型,所以通过该比较使它成为一个引人注重的候选。
虽然 EXML 通过使用抽象的基本类方法取得了某些相同效果,但它在避免使用接口方面使用与 JDOM 类似的方法(主要区别是接口为扩展实现提供了更大的灵活性)。它与 JDOM 的不同之处还在于避免使用 Collections 类。该组合为其提供了非常简单的 API,在许多方面类似于带有附加 XPath 操作的 DOM API 简化版本。
仅当空白与非空白文本内容邻近时,EXML 才在文档中保留空白,这就将 EXML 限制成 XML 文档的一个子集。标准 XML 需要在读取文档时保留该空白,除非对文档 DTD 可以确认有无空白无关紧要。对于事先已经知道空白无关紧要的许多 XML 应用程序来说,EXML 方法工作得很好,但是它防止对于期望保留空白的文档(例如,生成由浏览器显示或查看的文档的应用程序)使用 EXML。(有关作者对于该主题的谦虚建议,请参阅副栏使用空白的目的。)
EXML 使用集成的解析器依据文本文档构建文档表示。除了通过文本方式外,它不提供从 DOM(或 SAX2)转换或转换成 SAX2(或 DOM)事件流的任何方式。EXML 是由 Mind Electric 在禁止将它嵌入某些类型的应用程序或库的受限许可证下发布的开放源码。用于性能比较的版本是 Electric XML 2.2(jar 文件大小是 0.05MB)。
XML Pull Parser XML Pull Parser (XPP)是最近开发的,它演示了 XML 解析的不同方法。与 EXML 一样,XPP 只能适当支持 XML 文档的子集并且不提供验证的任何支持。它同样具有尺寸小的优势。这种优势再与拉回解析器方法结合,使它成为该比较中的良好替换项。
XPP 几乎独占地使用接口,但是它仅使用所有类中的一小部分。和 EXML 一样,XPP 避免使用 API 中的 Collections 类。总的来说,它是本文中最简单的文档模型 API。
在修改性能方面,XPP 仅次于 EXML,并且与 EXML 不同,XPP 测试包含删除。Xerces DOM 和 dom4j 接近地处于中间位置,JDOM 和 Crimson DOM 模型的性能仍是最差。
文本生成时间 这个测试检查将文档表示输出成文本 XML 文档所需的时间;结果显示在图 4 中。对于不专门使用 XML 文档的任何应用程序,该步骤似乎是整体性能的一个重要部分,非凡是因为将文档输出为文本所需的时间总体接近于对文档输入进行解析所需的时间。为使这些时间具有直接的可比性,该测试使用原始文档,而没有使用由前面的测试所生成的已修改文档。
图 4. 文本生成时间
文本生成时间测试表明各模型之间的差别小于前面测试中各项的差别,Xerces DOM 性能最好,但领先不多,JDOM 性能最差。EXML 的性能优于 JDOM,但是这同样是由于 EXML 废弃空白内容。
JDOM 和 Crimson DOM 在性能测试时一直表现不佳。在小文档情况下还值得考虑使用 Crimson DOM,而 Xerces 表现很差。虽然 JDOM 的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。然而,假如不进行 API 的重新构建,JDOM 可能难以达到与其它模型匹配的性能。
使用空白的目的 XML 规范通常需要保留空白,但是许多 XML 应用程序使用仅为可读性而保留空白的格式。对于这些应用程序,EXML 废弃隔离空白的方法起了作用。 这些性能中使用的大多数文档属于“为可读性而保留的空白”类别。这些文档被格式化成便于人们查看的形式,一行最多一个元素。结果,无关的空白内容字符串数实际上超过了文档中的元素数量。这大大增加了每一步处理的不必要开销。
支持修剪输入上这种类型空白的选项将有助于提高带有可忽略的空白的应用程序的所有文档模型的性能(除了 EXML 之外)。只要修剪是一个选项,它就不会影响需要完全保留空白的应用程序。解析器级别的支持将更好,因为解析器必须逐一处理输入字符。总之,这种类型的选项将非常有助于许多 XML 应用程序。
参加关于本文的论坛。 假如您需要背景知识,请尝试 developerWorks XML programming in Java、Understanding SAX tutorial 和 Understanding DOM tutorial。 从下载页面下载用于本文的测试程序和文档模型库。 在测试程序的主页上查看更新的测试和测试结果。 获取作者关于 XML Serial (XMLS) encoding 工作的具体信息作为 Java 序列化的替代项。 研究或下载本文中讨论的 Java XML 文档模型: Xerces Java Crimson JDOM dom4j Electric XML(EXML) XML Pull Parser(XPP) IBM WebSphere application Server 包含基于 Xerces Java 的 XML4J 解析器。可在 WAS Advanced edition 3.0 online documentation 中找到关于产品 XML 支持的 how-to 信息。
关于作者 Dennis Sosnoski(dms@sosnoski.com)是西雅图地区 Java 咨询公司 Sosnoski Software Solutions, Inc. 的创建者和首席顾问。他具有 30 多年的专业软件开发经验,最近几年,他集中研究服务器方 Java 技术,包括 servlet、Enterprise JavaBeans 和 XML。他已经多次演示了 Java 性能问题和常规服务器端的 Java 技术,他还是 Seattle Java-XML SIG 的主席。