Java的最佳XML解析器

我需要读取较小的XML文件(最多只有几MB, UTF-8编码),查找各种元素和属性,可能修改一些,并将XML再次写回磁盘(最好采用漂亮的缩进格式)。

最适合我的XML解析器是什么?有很多选择。我知道的有:

当然还有JDK中的那个(我用的是Java 6)。我熟悉Xerces,但觉得它很笨拙。

建议吗?

323283 次浏览

我发现dom4j是处理XML的工具。尤其是和薛西斯相比。

我认为您不应该考虑任何特定的解析器实现。用于XML处理的Java API允许你以标准的方式使用任何符合语法分析器的实现。代码应该具有更强的可移植性,并且当您意识到某个特定的解析器已经太旧时,可以用另一个解析器替换它,而不需要更改任何一行代码(如果操作正确的话)。

基本上有三种标准处理XML的方法:

  • 这是最简单的API。通过定义Handler类来读取XML,当以串行方式处理XML时,Handler类接收元素/属性中的数据。如果您只打算读取一些属性/元素和/或写回一些值(您的情况),则会更快更简单。
  • DOM此方法创建一个对象树,允许你随机修改/访问它,因此它更适合复杂的XML操作和处理。
  • StAX这是在SAX和DOM之间的路径中间。您只需编写代码,以便在处理数据时从您感兴趣的解析器中提取数据。

忘记专有api,如JDOM或Apache的api(即Apache Xerces XMLSerializer),因为它将把你绑定到一个特定的实现,这个实现可能会随着时间的推移而演变或失去向后兼容性,这将使你在未来想要升级到一个新版本的JDOM或任何你使用的解析器时更改你的代码。如果你坚持使用Java标准API(使用工厂和接口),你的代码将更加模块化和可维护性。

没有必要说所有的解析器(我还没有检查所有的解析器,但我几乎可以肯定)都符合JAXP实现,所以从技术上讲,您可以使用所有的解析器,无论哪种解析器。

如果速度和内存没有问题,dom4j是一个非常好的选择。如果你需要速度,使用像Woodstox这样的StAX解析器是正确的方法,但你必须编写更多的代码来完成工作,你必须习惯于处理流中的XML。

除了SAX和DOM之外,还可以使用XMLStreamReader进行STaX解析,XMLStreamReader是一个xml拉式解析器。

如果您不太关心性能,那么我是Apache Digester的忠实粉丝,因为它实际上允许您直接从XML映射到Java bean。

否则,您必须首先解析,然后构造对象。

我不建议这样做,因为您在应用程序中已经进行了大量的“思考”,但是使用XSLT可能比Java操作更好(从XSLT到字节码的编译可能更快)。

这是DOM, SAX, StAX &的一个很好的比较;TrAX (来源:http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/SJSXP2.html)

功能,,,,,,,,,,,,,,,,StAX,,,,,,,,,,,,,,,,SAX,,,,,,,,,,,,,,,,,,,,DOM,,,,,,,,,,,,,,,,TrAX

API类型 ,,,,,,,,,,,,,,拉,流媒体,,,在内存树中     

易用性 ,,,,,,,,高,,,,,,,,,,,,,,,,,,中,,,,,,,,,,,,,,,高,,,,,,,,,,,,,,,,,,媒介

XPath功能 ,No ,,,,,,,,,,,,,,,,,,,没有,,,,,,,,,,,,,,,,,,,,,是的,,,,,,,,,,,,,,,,,,,是的

CPU和;内存,,,好的,,,,,,,,,,,,,,,,好的,,,,,,,,,,,,,,,,,,不同,,,,,,,,,,,,,,,,不同

只有向前,,,,,,是的,,,,,,,,,,,,,,,,,,是的,,,,,,,,,,,,,,,,,,,,,,没有,,,,,,,,,,,,,,,,,,,,,没有

读取XML,,,,,,,,,,,,是的,,,,,,,,,,,,,,,,,,是的,,,,,,,,,,,,,,,,,,,,,,是的,,,,,,,,,,,,,,,,,,,是的

编写XML,,,,,,,,,,,,是的,,,,,,,,,,,,,,,,,,没有,,,,,,,,,,,,,,,,,,,,,,,,是的,,,,,,,,,,,,,,,,,,,是的

CRUD,,,,,,,,,,,,,,,,,,,,没有,,,,,,,,,,,,,,,,,,,,没有,,,,,,,,,,,,,,,,,,,,,,,是的,,,,,,,,,,,,,,,,,,,没有

Simple XML http://simple.sourceforge.net/非常容易(反)序列化对象。