【问题标题】:Best Java XML parser for producing/consuming REST services用于生成/使用 REST 服务的最佳 Java XML 解析器
【发布时间】:2010-10-11 11:53:16
【问题描述】:

目前使用 Java 的内置 XML DOM 库进行创建/解析。丑陋,即使有很多帮助类和方法,性能和内存使用也很糟糕。

在生成和使用 REST 服务方面,处理 XML 的最佳 Java 工具或框架是什么?

我使用的服务使用 JAXB。我能够使用他们的课程,从而方便、轻松地使用他们的服务。它很漂亮,但在大多数情况下,JAXB 仍然很痛苦。所以我研究了 StAX 和 VTD-XML。 StAX 大约有 4 年没有更新了。 VTD-XML 是 Java 处理 XML 的最先进技术吗?

【问题讨论】:

    标签: java xml xml-parsing vtd-xml


    【解决方案1】:

    您应该能够编写带有 JAXB 注释的类,Jersey 开箱即用地支持这些并自动为您解析它们。它可能不是最高效的解决方案,但却是一个非常干净的应用程序。

    除非您可以证明您有性能问题(并且可以将其追溯到 JAXB),否则我不会担心编组/解组开销。

    编辑:
    JAXB 注释类可以非常简单。像 XML 一样建模;

    <customer>
      <name>Fred</name>
      <email>fred@email.com</email>
      <id>12345</id>
    </customer>
    

    就这么简单;

    @XmlRootElement
    public class Customer
    {
      private String name;
      private String email;
      private long id;
    
      public Customer()
      {
      }
    
      //getters and setters
    }
    

    然后你可以像这样编写服务;

    @GET
    @Produces(MediaType.APPLICATION_XML)
    @Path("/getCustomer")
    public Customer getCustomer()
    {
      Customer c = new Customer();
      c.setName("Fred");
      c.setEmail("fred@email.com");
      c.setId(12345);
      return c;
    }
    

    ..还有这样的客户;

    Client client = Client.create();
    WebResource resource = client.resource("myHost/getCustomer");
    Customer fred = resource.get(Customer.class):
    

    它的漂亮很简单。

    【讨论】:

    • JAXB 的问题不仅仅是性能。事实上,我并不太关心性能。许多问题之一是我需要使用许多简单的服务,其中 XML 会根据我所做的 REST 调用而略有不同。使用 JAXB,我每次都必须创建一个全新的类层次结构来处理这个问题。在时间方面,它非常丑陋且效率低下。也许我只需要更好地学习 JAXB...对于生产服务,当我想要公开的内容根据访问者和访问方式而发生变化时,JAXB 也会让生活变得困难。
    • 如果服务之间的 XML 有很多不同的变化,那么无论您是使用 JAXB 注释类,还是手动解析 XML,您都必须以任何一种方式完成工作。
    • 除非您的所有元素都使用“required=true”注释进行修饰,否则您可以忽略不希望生成的那些,JAXB 将很乐意解析缺少可选元素的 XML。它们的值将简单地为空。
    【解决方案2】:

    StAX 很久没有更新了,因为它不需要更新。 XML 格式没有改变,StAX 是将该格式相当简单的映射到 API。随着低级 XML API 的发展,它非常易于使用,而且我相信非常高效;然而,它是一个非常低级的 API。它(非常粗略地)是用于写入二进制数据的 DataInputStream 和 DataOutputSteam 的 XML 等价物;使用它编写的代码必须在元素、属性等的概念级别上编写。我没用过VTD-XML,但看起来差不多。

    如果你想使用更高级别的东西,那么看看一些 XML 序列化工具,比如XStream - 你能写一些类,通过适当的转换自定义 - 可以从你的传入数据?然后,您能否将相同的类用于细微的不同输入,而忽略缺失的字段?实际上,您可以对 JAXB 使用“忽略缺失的 XML 元素”方法吗?我不知道模式有多严格,或者您的输入是否可以以这种方式处理。我在这里非常喜欢在黑暗中拍摄。

    【讨论】:

    • @vtd-xml-author:不知何故,我知道你可能有点偏见:)。但可以肯定的是,我听说过有关 VTD-XML 的好消息。
    【解决方案3】:

    我可以推荐 Spring MVC 3+。对 REST 服务有开箱即用的支持。创建 REST 服务需要几分钟 如果您了解 Spring...

    http://blog.springsource.com/2009/03/08/rest-in-spring-3-mvc/

    【讨论】:

    • 这就是我最终要做的。
    猜你喜欢
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 2015-08-18
    • 2012-03-27
    • 2017-12-26
    相关资源
    最近更新 更多