我该去哪里找到关于Java XML框架的详细比较?

28

我正在为我的Java项目选择一个XML处理框架,但是我在各种名称中迷失了方向。例如XOM、JDOM等等。我应该去哪里找到所有热门Java XML框架的详细比较呢?


5
这是一些Java中的XML处理器清单,我没有进行比较:http://java-source.net/open-source/xml-parsers - Buhake Sindi
1
请注意,这些解析器项目中有一些已经多年没有更新了。如果您对对象到XML绑定感兴趣,请查看MOXy JAXB(我是技术负责人):http://bdoughan.blogspot.com/2010/09/xpath-based-mapping-geocode-example.html - bdoughan
不要关闭,考虑迁移到https://softwarerecs.stackexchange.com。 - Michael Freidgeim
2019年更新 https://www.baeldung.com/java-xml-libraries。 这是一个老问题,在2021年仍然相关。 - Raymond Chenon
2个回答

71
如Blaise所指出,要坚持标准。但是在解决不同问题/用例的过程中创建了多个标准。选择哪个完全取决于您的要求。我希望下面的比较可以帮助您选择正确的标准。
现在有两件事情需要选择。API和API实现(有很多)
API
SAX:优点
- 基于事件 - 内存效率高 - 比DOM更快 - 支持模式验证
SAX:缺点
- 没有对象模型,您必须进入事件并自己创建。 - 仅解析xml一次,只能向前移动。 - 只读API - 没有xpath支持 - 使用起来有一点困难
DOM:优点
  • 内存对象模型
  • 保留元素顺序
  • 双向
  • 读写api
  • XML操作
  • 简单易用
  • 支持模式验证

DOM: 缺点

  • 对于较大的XML文档来说,会占用大量内存(通常用于小于10 mb的XML文档)
  • 速度较慢
  • 通用模型,即您需要使用节点进行操作

Stax: 优点

  • 结合了SAX和DOM的优点,即DOM的易用性和SAX的效率
  • 内存利用率高
  • 推模型
  • 读写api
  • 支持子解析
  • 可以在一个线程中同时读取多个文档
  • 更容易进行XML的并行处理

Stax: 缺点

  • 没有模式验证支持(据我所记,不确定是否已经添加)
  • 只能像SAX一样向前处理
  • 没有XML操作功能

JAXB:优点

  • 允许您访问和处理XML数据,无需了解XML
  • 双向性
  • 比DOM更节省内存
  • SAX和DOM是通用解析器,而JAXB创建了一个特定于您的XML Schema的解析器
  • 数据转换:JAXB可以将xml转换为java类型
  • 通过对象API支持XML操作

JAXB:缺点

  • 只能解析有效的XML

Trax:用于使用XSLT从一种形式转换XML到另一种形式

实现

SAX、DOM、Stax、JAXB只是规范。有很多开源和商业实现这些规范。大多数情况下,你可以使用 JDK 或应用服务器自带的实现。但有时需要使用不同的默认实现,这就是你能够体验到 JAXP wrapper api 的地方。JAXP 允许你通过配置切换实现,无需修改代码。它还提供了一个与解析器/规范无关的 API ,用于解析、转换、验证和查询 XML 文档。

各种实现的性能和其他比较


现在的标准很好,但偶尔会遇到这种疯狂的用例,需要支持解析大小为100 GB的XML文档,或者需要超高速处理XML(可能正在实现XML解析器芯片),这就需要放弃使用标准,寻找不同的解决方案。关键是要选择正确的工具来完成任务!这就是我建议您看看vtd-xml的地方。

SAX和DOM最初的几天,人们希望拥有比它们提供的更简单的API。JDOMdom4jXmlBeansJiBXCastor是我知道的流行的工具。


1
JAXB(JSR-222)实现不需要XML模式或编译步骤。以下是从Java类开始的示例:http://blog.bdoughan.com/2012/07/jaxb-no-annotations-required.html - bdoughan
3
请问那位给我点踩的绅士能解释一下原因吗? - Aravind Yarram
不要相信任何实现!天啊,我刚才真是太倒霉了。在我的本地机器上,Oracle JDK 8单元测试解析XML节点的字符串值是这样的:'vyFPEHYkvQNfrR6i',而生产系统则输出[#text: vyFPEHYkvQNfrR6i]。同一来源。太疯狂了! - John Smith

2

@Pangea

JAXB vs DOM and SAX

JAXB与DOM和SAX不是直接可比的。Java DOM和SAX解析API是低级别的API,用于解析XML文档,而JAXB(Java API for XML Binding)是一种更高级别的API,用于将XML元素和属性转换为Java对象层次结构(反之亦然)。JAXB的实现很可能会在幕后使用DOM或SAX解析器来执行实际的XML输入数据解析。


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