【问题标题】:JAXB vs DOM and SAXJAXB 与 DOM 和 SAX
【发布时间】:2011-12-04 07:50:41
【问题描述】:

一段时间以来,我一直在使用 DOM 来解析我的小型 xml 文档。在阅读了有关 JAXB (http://www.oracle.com/technetwork/articles/javase/index-140168.html) 的信息后,我打算使用 JAXB 代替 DOM。

请让我知道这是否是正确的方法。

【问题讨论】:

    标签: java xml performance jaxb


    【解决方案1】:

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

    您通常希望将 XML 文档的内容转换为 Java 程序中的对象。如果这是您想要做的,那么 JAXB 可能会更容易使用,并且与使用 DOM 或 SAX 解析 API 时相比,您需要编写的代码更少。

    这是否适合您的案例取决于您的项目的功能和技术要求。

    【讨论】:

    • 是否也可以说,JAXB 比 DOM 使用的内存空间要多得多,因为它比 DOM 更高级别?
    • @ErayTuncer 不一定,这取决于内部如何实现 JAXB。仅仅因为它的更高级别并不自动意味着它会消耗更多的内存空间。
    【解决方案2】:

    (约晚了 7 年,但仍然如此)

    为了与公认的答案相矛盾,我非常怀疑 JAXB 是在 DOM 之上实现的——这将需要两个 Object Models(Java 和 DOM)并且会完全违背 XML binding 的观点(XB 在 JAXB 中)对于性能/空间来说更糟,它需要两个模型相互支持。

    在考虑在 Java 中处理 XML 双向映射的方法时,在我看来,JAXB 显然是 DOM 的类似物。 DOM 和 JAXB 只是 IBM 称之为 XOM 的例子。

    在几乎所有情况下,我都更喜欢 JAXB 而不是 DOM,更喜欢 handrolled 而不是 SAX - 主要是因为我发现 SAX 和 DOM API 的“语言不可知论”完全是怪诞的。


    显然,如果您的数据集太大而无法放入内存,那么 对象模型 是不可行的。否则

    如何选择:

    • 有一个 Java 模型,还是从 XML 加载一个?这是序列化,只需使用 JAXB
    • 没有 Java 模型,时间/空间至上,简单的单通道属性/元素查询,模式未知?使用 SAX
    • 没有 Java 模型和时间/空间至高无上,但模式是已知的、不变的和简单的?自己动手吧,说真的,这很简单(不过,请务必使用 XSD 和 JAXB 以及代码生成器来测试您的实现)
    • XML 模式是否是先验未知的,可能会在没有通知的情况下更改,或者是否允许任意未知(命名空间)扩展?使用 DOM
    • XML 模式是锁定的还是您拥有?使用 JAXB

    【讨论】:

      【解决方案3】:

      JAXB,代表用于 XML 绑定的 Java 架构。 JAXB 用于编组(Java 对象到 XML 表示)和解组(XML 内容到 Java 对象)

      请点击此链接以更好地了解JAXB Architecture

      【讨论】:

        【解决方案4】:

        JAXB 从代码编写较少的意义上来说会很容易。但是,如果您需要对解析进行更多控制,您应该使用 SAX parser 。它使您可以更好地控制解析,并且比 DOM 解析器更快。除此之外,JAXB 是高级 API,所以它有一些开销任务,所以它会比 SAX 慢一些。

        【讨论】:

          【解决方案5】:

          JAXB 不支持 XPath。您需要一个模式来生成 api。如果您有未知或潜在的错误 XML,您的程序会以验证错误结束。如果您只想解析而不是验证,则不适合容错 XML 处理。不适合处理未知的 XML 和在内部寻找已知的节点结构。复杂的 XML 结构中的导航会产生很多可读性差的代码。

          如果您使用 JAXB,您将在 XML 结构和您的 java 代码之间实现修复耦合。如果 XML 发生更改,您必须更改代码并进行部署。可能会很痛苦。如果你使用 XPath,你可以完成 XML-structur 和 java 代码的解耦,如果 XPath 在外部配置中。

          【讨论】:

          • 如果您的意思是我的回答没有用,请向我展示一个示例,如何在具有深度 > 3 的 XML 结构中进行良好的可读导航。如何简单地迭代节点的子节点?在 XML-DOM 和 XPath 中没问题——简单! JAXB 最适合简单的 XML,如果您不想考虑(或不能)复杂的 XML 结构。
          【解决方案6】:

          查看此帖子What is JAXB and why would I use it? 与传统的 DOM 和 SAX 解析器相比,使用 JAXB 总是更好。

          【讨论】:

          • “总是更好”?我强烈不同意。例如,对于大量输入,SAX 与 DOM 和 JAXB 相比具有显着的优势。此外,允许任意元素的 XML 可能很难用 JAXB 处理。
          • 查看这篇文章dublintech.blogspot.co.uk/2011/12/jaxb-sax-dom-performance.html 事实证明,使用 JDK 7,JAXB 的任何实现都比 DOM 更高效!
          猜你喜欢
          • 2012-07-31
          • 2010-10-15
          • 2012-07-28
          • 2010-09-16
          • 1970-01-01
          • 1970-01-01
          • 2012-06-01
          • 2011-11-01
          • 2010-09-12
          相关资源
          最近更新 更多