适用于Java的最佳XML解析器


387

我需要阅读较小的(最多几个MB,UTF-8编码)XML文件,四处寻找各种元素和属性,也许要修改一些并将XML重新写回磁盘(最好采用缩进格式) 。

什么是满足我需求的最佳XML解析器?有很多可供选择。我知道的一些是:

当然是JDK中的那个(我正在使用Java 6)。我对Xerces很熟悉,但是觉得笨拙。

建议?


6
我认为,您可以在此处找到更多播放器:xml.com/lpt/a/1703
dma_k 2010年

1
我认为这个问题确实存在问题。1是将完全不同的事物进行比较,将解析器(xerces,深红色)与dom操纵库(dom4j,xom,jdom)结合在一起。答案也倾向于倡导而不是建设性的。
内森·休斯

51
+220而并非建设性的。显然,主持人和用户对什么是建设性有不同的看法。
tbroberg 2014年

5
是的,当涉及到此类问题时,mod似乎是短视的。是的,答案将是有根据的,但肯定是基于经验和大多数情况下答案的量化。国防部需要创建一个可能不同的标签来移动这些问题,这些问题需要讨论,从而引发建设性的批评和结果。
阿什拉夫·阿里·瓦哈卜

@dma_k您的链接无效。
gaurav

Answers:


81

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


6
dom4j很好,但绝对不是没有问题。为了获得良好的dom4j的替代品,看stackoverflow.com/questions/831865/...
Jonik

@zehrer他们是线程安全的吗?
gaurav

257

我认为您不应该考虑任何特定的解析器实现。用于XML处理的Java API使您能够以标准方式使用任何符合条件的解析器实现。该代码应该具有更大的可移植性,并且当您意识到某个特定的解析器太旧时,可以在不更改代码行的情况下(如果正确执行)将其替换为另一个。

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

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

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

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


11
其实有3种方式:StAX(javax.xml.stream)是第三种标准方式。
StaxMan 2009年


@kitokid Chrome告诉我该页面上有讨厌的东西。我改用了它:sce.uhcl.edu/yue/courses/xml/notes/xmlparser/IntroDOM.asp
Ryan Shillington

良好的概述:我只不同意一件事-对于增量/流,SAX和Stax很好,标准API足够,对于DOM则不是这种情况(IMO):特定于Java的需求有正当的理由,例如XOM,JDOM和DOM4J:与语言无关的DOM使用起来非常麻烦。
StaxMan

130

这是对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类型                 拉,流推送,流在内存树中的XSLT规则

易于使用           高中高中

XPath功能    否否是是

CPU和内存     良好良好变化

仅转发        是是否否

读取XML              是是是是

写入XML              是否是是

CRUD                      否否是否


7
您可以使用SAX编写XML。接收器提供了一个处理程序实现,用户可以调用该处理程序以生成XML输出。(我看到这张表不是原始材料,而是表格的来源,但是
2013年


4

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



2

我不建议您这样做,因为您的应用程序中有很多“想法”,但是使用XSLT可能比Java操作更好(并且在XSLT到字节码的编译中可能更快)。


3
更好,可能:更快,非常不可能。
StaxMan

读取,操纵和编写XML正是XSLT设计要做的。这是一个很好的即用型答案。
james.garriss 2014年

1

如果您不太在乎性能,那么我非常喜欢Apache Digester,因为它实质上使您可以直接从XML映射到Java Bean。

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


我不需要制作Java Bean,只需稍微处理原始XML元素,然后查看某些元素以从中获取数据,因此DOM样式解析器可能是我的理想解决方案。
伊万

是的,dom4j可能是一个更好的解决方案...我曾经大量使用它,直到我上一级消化池为止
Uri
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.