Java最佳XML解析器

397

我需要读取不大的(最多几MB,UTF-8编码)XML文件,并查看各种元素和属性,可能会修改其中一些内容并将XML重新写回磁盘(最好使用漂亮的缩进格式)。

对于我的需求,哪种XML解析器最好?有很多可以选择。我知道的一些包括:

当然,还有JDK中的XML解析器(我正在使用Java 6)。我熟悉Xerces但觉得它笨重。

你有什么推荐吗?


6
我认为,在这里你可以找到更多的玩家:http://www.xml.com/lpt/a/1703。 - dma_k
1
我认为这个问题存在真正的问题。首先,它比较了完全不同的东西,将解析器(xerces、crimson)与DOM操作库(dom4j、xom、jdom)混为一谈。其次,答案倾向于宣传而不是建设性的意见。 - Nathan Hughes
@dma_k,你的链接无法访问。 - Gaurav
很不幸,链接已经失效了。它是9年前发布的。当我在进行自己的研究时,我对这个话题很感兴趣,研究的内容是关于使用哪个DOM操作库。我的研究链接 - dma_k
Underscore-java库可以读取和生成XML字符串。 - Valentyn Kolesnikov
我知道我真的晚了15年才来参加这个派对(而且说实话,那时可能甚至不存在),但是如果你已经在使用JSoup进行HTML解析,那么它同样非常适用于XML。 - Krusty the Clown
8个回答

262

我认为你不应考虑任何特定的解析器实现。Java API for XML Processing允许您以标准方式使用符合规范的任何解析器实现。代码应该更具可移植性,当您意识到特定解析器已经过时时,您可以在不更改代码的情况下替换它(如果您正确地执行了这项操作)。

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

  • SAX 这是最简单的API。您通过定义接收元素/属性内部数据的处理程序类来读取XML,当XML按顺序进行处理时,处理程序类会接收数据。如果您只计划读取一些属性/元素和/或写入一些值,则该方法更快且更简单(适合您的情况)。
  • DOM 此方法创建一个对象树,使您能够随机修改/访问它,因此更适用于复杂的XML操作和处理。
  • StAX 介于SAX和DOM之间。您只需编写代码,从您感兴趣的解析器中提取数据。

不要考虑专有API,如JDOM或Apache(即Apache Xerces XMLSerializer),因为这会将您绑定到特定实现上,该实现可能会随时间推移而发生变化或失去向后兼容性,这将使您在将来想要升级到新版本的JDOM或任何解析器时更改代码。如果您坚持使用Java标准API(使用工厂和接口),则代码将更具模块化和可维护性。

毋庸置疑,所有(我没有检查所有,但我几乎可以确定)建议的解析器都符合JAXP实现规范,因此您可以使用所有解析器,无论哪个。


11
实际上有3种方式:StAX(javax.xml.stream)是第三种标准方式。 - StaxMan
1
http://www.java-samples.com/showtutorial.php?tutorialid=152(个人喜欢SAX) - kitokid
@kitokid Chrome告诉我该页面有恶意内容。我使用了这个链接代替:http://sce.uhcl.edu/yue/courses/xml/notes/xmlparser/IntroDOM.asp - Ryan Shillington
很好的概述:只有一件事我不同意 - 对于增量/流式处理,SAX和Stax是很好的标准API,但对于DOM来说并非如此(在我看来):像XOM、JDOM和DOM4J这样的Java特定工具是有其合理的原因的:与语言无关的DOM使用起来相当麻烦。 - StaxMan

132
以下是DOM、SAX、StAX和TrAX的比较: 特征 StAX SAX DOM TrAX API类型 拉取,流 推送,流 内存树 XSLT规则 易用性 高 中等 高 中等 (来源:http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/SJSXP2.html

XPath能力   无                       无                        是                      是

CPU和内存     良好                  良好                    不确定                  不确定

仅正向遍历        是                    是                       否                       否

读取XML              是                  是                  是                  是

写入XML              是                  否                   是                  是

CRUD                   增删改查                 否                否                是                否


7
您可以使用SAX编写XML。此处的“sink”提供了一个处理程序实现,用户可以调用SAX事件来生成XML输出。(我看到这个表格是来源于非原创材料,不过表格是错误的。) - Dev

83
如果速度和内存不是问题,dom4j 是一个非常好的选择。如果您需要速度,则使用 StAX 解析器如 Woodstox 是正确的方法,但您需要编写更多代码来完成任务,并且您需要习惯在流中处理 XML。

6
dom4j相当不错,但是肯定存在问题。关于好的dom4j替代方案,请查看https://dev59.com/eHRA5IYBdhLWcg3wxA9N - Jonik
@zehrer它们是线程安全的吗? - Gaurav

8

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

3

我发现dom4j是处理XML的工具,尤其是与Xerces相比。


2

如果您的应用程序需要大量“思考”,我不建议使用此方法,但使用XSLT可能比Java操作更好(并且通过XSLT到字节码编译可能更快)。


3
更好、可能性更大:更快,非常不可能。 - StaxMan
阅读、操作和编写XML正是XSLT的设计目的。这是一个很好的开箱即用的答案。 - james.garriss

1
如果您不太关心性能,我非常推荐使用Apache Digester,因为它可以让您直接将XML映射到Java Bean。 否则,您需要先解析XML,然后构造对象。

我不需要制作Java Beans,只需稍微操作原始的XML元素,并检查特定的元素以从中获取数据,因此DOM样式解析器可能是我的理想解决方案。 - Evan
是的,在那种情况下,dom4j可能是更好的解决方案...我曾经大量使用它,直到我升级到digester。 - Uri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,