2

我们可以使用其中任何一种(SAX、DOM、STAX、XSTREAM)将 XML 转换为对象。请告诉我,选择其中之一的标准是什么。

4

4 回答 4

1

Marco Tedone 的这个基准比较可能会帮助您选择一种解析方法。
Java中的XML解组基准:JAXB vs STax vs Woodstox

于 2012-08-10T15:56:43.480 回答
1

SAX 和 DOM 是不同的样式解析器。它们之间的主要区别在于 DOM 会将整个文档加载到内存中并允许您对其执行操作(例如 XPath 查询)。SAX 将解析 XML 文档并回调到您的代码中。

作为一般的经验法则,如果您要问的话,我认为 DOM 一开始可能更容易使用,并且可能不会成为问题,除非您需要将巨大的 XML 文档加载到内存中。

如果您希望将 XML 转换为 Java 对象,那么有一些框架可以为您完成这项工作,并抽象出 XML 解析层。我过去使用过 Castor,但可能有更新的框架可以通过快速的 Google 找到。

于 2012-08-10T13:57:03.017 回答
1

JAXB (JSR-222)是用于将域对象转换为 XML 或从 XML 转换的 Java 标准。从 Java SE 6 开始,JDK/JRE 中包含一个实现。还有其他可用的开源实现(我是EclipseLink JAXB (MOXy)负责人)。

既然你提到了 XStream,下面是我写的一篇比较 JAXB 和 XStream 的文章:

DOM是一种内存数据结构,将 XML 数据表示为Node对象树。有Node代表元素、属性、文本等的扩展。

SAX/StAX是非常轻量级的 API,允许您处理非常大的 XML 文档。

于 2012-08-10T20:05:03.443 回答
0

DOM 解析器是树建模的。它通常会根据 XML 文件中的嵌入结构为 XML 文档构建一个完整的树。DOM 的优点是您可以随机访问任何 XML 节点、它们的子节点、兄弟节点以及属性。显然,缺点是这种方法会消耗过多的 RAM,因为它会尝试将所有 XML 数据加载到内存中。

至于 SAX,它是基于事件的。它以流的形式读取 XML 数据,当某些事件(文档开始/结束、遇到的打开/关闭标签等)发生时,您可以覆盖这些函数。当您处理大型 XML 数据时,此解析器的功能要强大得多。但是,正如您可以猜到的,当流数据流走时,您永远无法将它们取回。因此,SAX 解析器不可能进行随机访问。

关于 StAX,与 SAX 和 DOM 相比,它是一个相对较新的模型,事实上,它被设计为之前两个模型之间的中间值。它使您能够读取和写入 XML 文档。StAX 的思想是保持 SAX 的流特性。但是这个与 SAX 的流不同。我们称之为拉流,而对于 SAX,它是推流。在推流模型中,解析器无论客户端当时是否准备好使用它,解析器都会发送数据。相反,只有当我们的应用程序准备好使用数据时,拉流模型才会明确要求 XML 数据。

在我看来,StAX 是最好的选择,但 DOM 和 SAX 也可能是了解优缺点的良好开端。

注意:由于我的知识有限,我对XSTREAM了解不多。希望其他人可以帮助你!

于 2012-08-10T14:19:50.263 回答