【问题标题】:Best XML handling class in Java [closed]Java中最好的XML处理类[关闭]
【发布时间】:2009-08-28 09:17:58
【问题描述】:

Java 中处理 XML 文档的最佳类是什么?

【问题讨论】:

  • 奇怪的是,大多数 Java 框架都严重依赖 XML,但例如,与 Python 相比,Java 语言对 XML 的支持很差。
  • 注意,编程语言叫“Java”,不是首字母缩写,所以不能全大写“​​JAVA”。
  • Python 在其标准库中对 XML 的支持很差。最好的库(例如 lxml)是由第三方提供的。 Java 也在同一条船上,只是它的标准 XML 库很差 庞大,并且有更多的第三方替代品。

标签: java xml


【解决方案1】:

这实际上取决于您要对 XML 文档做什么以及文档有多大。

大致而言,您可以将 XML API 分类为:

  • DOM API - 将整个文档加载到内存中,这会限制您可以处理的文档大小,但可以为导航和转换创建优化的结构
  • 流式 API - 您的应用程序必须解释低级解析事件(例如元素开始、元素结束等),但您不受内存限制。有两种流式 API - 推式和拉式。推送解析器在您定义的对象上触发解析事件,并且该对象必须跟踪当前解析状态,例如使用状态机或堆栈)。拉解析器让您的应用程序从解析器中拉解析事件。这使得编写递归下降解析器来处理 XML 内容变得很容易,但是堆栈大小成为您可以处理的文档大小的限制。
  • XML 映射器 - 将 XML 内容映射到 Java 对象。 XML 映射有两种主要方法:代码生成或反射。代码生成映射器从 XML 模式生成 Java 类,这意味着您不必在 Java 代码中复制模式结构,但确实存在 Java 代码完全反映模式结构的缺点。此外,大多数代码生成器创建的 NOJO 类很难使用并且没有自己的行为。反射映射器允许您编写具有丰富行为的 Java 类,然后定义它们如何映射到 XML 或从 XML 映射。如果您需要符合预定义的模式,则必须确保您的类和映射配置是正确的 w.r.t。那个架构。

一些可用的选项是:

  • DOM API:标准库中的 DOM API 是标准的(显然!),因此可以与其他库互操作,但它们很糟糕。还有几个更方便的类似 DOM 的 API,例如 XOM(我最喜欢的原因与上面 Adam Batkin 给出的相同)或 JDOM。看看几个,然后决定你喜欢哪个 API。
  • 流式 API:标准库包含 SAX 推送解析器的实现。 Java 的标准拉取解析器是 StAX
  • 映射 API:JAXB 是 JSR 标准,但我更喜欢 XStream,因为我可以更轻松地将映射配置与映射的类分开(无需注释或 XML 配置),并将对象映射到/从其他数据格式。

【讨论】:

  • +1 表示:它取决于" -- 以及它取决于什么。
【解决方案2】:

我发现dom4j 比我使用过的其他任何东西(尤其是 JDOM,我发现它的 API 特别差)更胜一筹。 dom4j 也允许插入 Jaxen 以获得 XPath 支持。

例子:

   SAXReader reader = new SAXReader(); // dom4j SAXReader  
   Document document = reader.read(xmlInputStream); // dom4j Document  

   // select all link nodes with href "http://example.com"  
   List<Element> linkNodes = document.selectNodes("//link[@href='http://example.com']");  

   // select an attribute value  
   String val = linkNodes.get(0).attributeValue("href");  

   // select element text and trim it  
   String value = document.elementTextTrim("childNode");  

【讨论】:

    【解决方案3】:

    为了方便使用,我认为是JDOM

    【讨论】:

      【解决方案4】:

      JAXB 我很幸运。它包含在 Java SE 6 中。

      【讨论】:

      • JAXB 是一种 OXM 绑定解决方案,而不是一般的 XML 解析器。它使用 XML 解析器,但它本身不是一个。
      • 是的,但问题不在于通用 XML 解析器。它是“Java 中处理 XML 文档的最佳类是什么?”。而 JAXB 绝对是替代方案之一。
      【解决方案5】:

      有很多库可以让您以不同的方式处理 XML,没有一种方式是“最好的”。与往常一样,这取决于您要做什么以及您的要求是什么。

      当我需要类似 DOM 的解析器或构建 XML 文档时,我个人喜欢XOM,因为它可以保证 XML 文档格式正确且“正确”。它的第一要务是正确性,这在与其他系统互操作时很重要,而 XML 做得很好。它的 API 也设计得非常好和直观,让常用操作变得非常简单。

      【讨论】:

        【解决方案6】:

        我更喜欢使用 DOM 和 SAX 的经典组合。

        【讨论】:

          【解决方案7】:

          如果您只是在阅读,那么 XPath 是一个不错的选择。否则,DOM(在org.w3c.dom 包中)是您最好的选择。

          【讨论】:

          • "best" 并没有被定义为最容易理解和编码。我在 org.w3c.dom 中看到了接口,所以你仍然需要某种实现。
          【解决方案8】:

          Java 对 XML 有很好的支持。从某种意义上说,问题在于有很多选择。因此,没有一种解决方案是在 Java 中处理 XML 的“最佳”方式。您必须根据手头的问题来选择工具。

          假设您想要将经过验证的复杂文档加载到对象树中,然后您可以查询和操作该树。为此,您需要一个 DOM 解析器,并且有多个可供选择。这会将整个文档转换为对象,这在 CPU 方面的成本可能很高。

          假设您有一个文档要从中选择某些元素,而性能是一个问题。试试 SAX 解析器、拉式解析器或 XPath。

          也许您需要对线路上的对象进行编组/解组。与其他选项一样,JAXB 是一个候选者。

          因此,您的问题没有一个正确答案。与任何 [编程] 问题一样,您必须查看问题、评估选项并选择最适合工作的工具。

          【讨论】:

            【解决方案9】:

            您必须在两种不同的 XML 处理方法之间做出选择:DOMSAX,各有优缺点。这完全取决于您的需求和您要处理的 XML 文档的大小。已经提到的JAXB 在两者之上构建了一个 API,并随 Java 6 一起提供。

            当您了解上述内容后,您可能想要具体化您的问题,并可能要求最好的 DOM 或最好的 SAX 实现。除此之外,如果您能说出您的要求是什么,那就太好了。您想编写还是阅读 XML?文件有多大?以此类推。

            编辑:

            正如Nat 所指出的,还有StAX 作为第三种替代概念。

            【讨论】:

            • 还有StAX,它和SAX 一样是低级的,但它允许客户端代码从流中提取XML 事件,而不是处理从解析器推送给它的事件。这使得编写递归下降解析器来处理 XML 内容变得容易。
            • @Nat:没用过,谢谢你的提示!刚刚编辑了我的答案并包含了一个链接。
            【解决方案10】:

            每当我需要处理 XML 文档时,我总是将 dom4j/sax 作为首选,它从不让我失望。 ;)

            您应该查看 SAXReader。

            【讨论】:

              【解决方案11】:

              @Epaga,如果你不把“最好”放在上下文中,你会惨败。

              例如,尝试在类似 DOM 的结构中加载巨大的 XML 是非常愚蠢的。您必须明智地选择工具。

              【讨论】:

                【解决方案12】:

                XOM (http://www.xom.nu) 是一个简单、灵活的 XML 工具包,我发现它比许多其他解析器更简单易用。自从从标准的基于 W3C 的工具切换后,我的工作效率大大提高了。作者 Elliotte Rusty Harold 在他的网页中解释了为什么 XOM 的设计是 XML DOM 的合适模型。

                【讨论】:

                  猜你喜欢
                  • 2010-10-10
                  • 1970-01-01
                  • 2012-04-13
                  • 1970-01-01
                  • 2013-10-29
                  • 1970-01-01
                  • 2011-03-22
                  • 2016-02-22
                  • 2010-10-25
                  相关资源
                  最近更新 更多