【问题标题】:Best XML parser for Java [closed]Java 的最佳 XML 解析器 [关闭]
【发布时间】:2010-09-27 07:02:36
【问题描述】:

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

什么是最适合我需要的 XML 解析器?有很多可供选择。我知道的一些是:

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

建议?

【问题讨论】:

  • 我想,你可以在这里找到更多玩家:xml.com/lpt/a/1703
  • 我认为这个问题确实存在问题。 1 是在比较完全不同的东西,将解析器(xerces、crimson)与 dom 操作库(dom4j、xom、jdom)混为一谈。答案也倾向于宣传,没有那么建设性。
  • @dma_k 你的链接失效了。
  • 不幸的是,链接消失了。是 9 年前发布的。当我去own research 讨论要采用什么 DOM 操作库时,我对这个话题很感兴趣。
  • Underscore-java库可以读取并生成xml字符串。

标签: java xml parsing


【解决方案1】:

我发现 dom4j 是处理 XML 的工具。尤其是与 Xerces 相比。

【讨论】:

    【解决方案2】:

    我认为您不应该考虑任何特定的解析器实现。 Java API for XML Processing 允许您以标准方式使用任何符合标准的解析器实现。代码应该更易于移植,当您意识到某个特定的解析器已经过时,您可以用另一个解析器替换它,而无需更改您的代码行(如果您做得正确的话)。

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

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

    忘记诸如 JDOM 或 Apache 之类的专有 API(即 Apache Xerces XMLSerializer),因为它们会将您绑定到可以及时发展或失去向后兼容性的特定实现,这将使您在将来需要时更改代码升级到新版本的 JDOM 或您使用的任何解析器。如果您坚持 Java 标准 API(使用工厂和接口),您的代码将更加模块化和可维护。

    没有必要说所有(我没有检查所有,但我几乎可以肯定)提出的解析器都符合 JAXP 实现,所以从技术上讲,您可以使用所有,不管是哪一个。

    【讨论】:

    • 其实有3种方式:StAX(javax.xml.stream)是第三种标准。
    • @kitokid Chrome 告诉我该页面上有讨厌的东西。我改用这个:sce.uhcl.edu/yue/courses/xml/notes/xmlparser/IntroDOM.asp
    • 好的概述:只有一件事我不同意——而对于增量/流,SAX 和 Stax 很好,标准 API 就足够了,但对于 DOM,情况并非如此(IMO):有使用 XOM、JDOM 和 DOM4J 等特定于 Java 的有效理由:与语言无关的 DOM 使用起来非常麻烦。
    【解决方案3】:

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

    【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 我不需要制作 Java Bean,只需稍微操作原始 XML 元素,并查看某些元素以从中获取数据,因此 DOM 样式解析器可能是我理想的解决方案。跨度>
      • 是的,dom4j 可能是一个更好的解决方案...我曾经大量使用它,直到我升到消化器的一个级别
      【解决方案6】:

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

      【讨论】:

      • 更好,可能:更快,非常不可能。
      • 读取、操作和编写 XML 正是 XSLT 的设计目的。这是一个很好的开箱即用答案。
      【解决方案7】:

      这是对 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                      否                                                           是                    没有

      【讨论】:

      • 您可以使用 SAX 编写 XML。接收器提供了一个处理程序实现,用户可以调用 SAX 事件来生成 XML 输出。 (我看到表格是来源而不是原始材料,但表格是错误的)
      【解决方案8】:

      简单的 XML http://simple.sourceforge.net/ 非常容易用于(反)序列化对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-21
        • 2013-03-14
        • 1970-01-01
        • 2013-01-31
        • 1970-01-01
        • 1970-01-01
        • 2011-07-25
        • 1970-01-01
        相关资源
        最近更新 更多