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

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

杰登 伍兹托克斯 XOM Dom4j VTD-XML 薛塞斯-J 深 红色

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

建议吗?


当前回答

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

其他回答

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

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

SAX This is the simplest API. You read the XML by defining a Handler class that receives the data inside elements/attributes when the XML gets processed in a serial way. It is faster and simpler if you only plan to read some attributes/elements and/or write some values back (your case). DOM This method creates an object tree which lets you modify/access it randomly so it is better for complex XML manipulation and handling. StAX This is in the middle of the path between SAX and DOM. You just write code to pull the data from the parser you are interested in when it is processed.

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

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

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

下面是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类型Pull,streaming Push,streaming在内存树中XSLT规则

易用性           高                    媒介                 高                    媒介

XPath功能没有                        没有                         是的                       是的

CPU和内存好                  好                    不同                  不同

提出只有是的                    是的                        没有                       没有

读取XML              是的                    是的                        是的                     是的

编写XML              是的                    没有                          是的                     是的

CRUD                      没有                      没有                         是的                     没有

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

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

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