用于生成/使用REST服务的最佳Java XML解析器

用于生成/使用REST服务的最佳Java XML解析器,java,xml,xml-parsing,vtd-xml,Java,Xml,Xml Parsing,Vtd Xml,目前正在使用Java的内置XMLDOM库进行创建/解析。丑陋,即使有很多助手类和方法,性能和内存使用也很糟糕 在生成和使用REST服务方面,处理XML的最佳Java工具或框架是什么 我使用的服务使用JAXB。我能够使用他们的类,因此可以方便、轻松地使用他们的服务。它很漂亮,但在大多数情况下,JAXB仍然是一种痛苦。所以我研究了StAX和VTD-XML。StAX已经有4年没有更新了。VTD-XML是Java中XML处理的最新技术吗?您应该能够编写JAXB注释类,Jersey支持这些现成的类并自动为

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

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


我使用的服务使用JAXB。我能够使用他们的类,因此可以方便、轻松地使用他们的服务。它很漂亮,但在大多数情况下,JAXB仍然是一种痛苦。所以我研究了StAX和VTD-XML。StAX已经有4年没有更新了。VTD-XML是Java中XML处理的最新技术吗?

您应该能够编写JAXB注释类,Jersey支持这些现成的类并自动为您解析它们。它可能不是性能最好的解决方案,但它是一款非常好的干净应用

除非你能证明你有一个性能问题(并且可以追踪到JAXB),否则我不会担心编组/解编开销

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

<customer>
  <name>Fred</name>
  <email>fred@email.com</email>
  <id>12345</id>
</customer>
然后您可以编写这样的服务

@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):
..和这样的客户

@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):

它非常简单。

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


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

我可以推荐Spring MVC 3+。对REST服务有现成的支持。如果您知道Spring,创建REST服务需要几分钟的时间


JAXB的问题不仅仅是性能问题。事实上,我并不太在乎表现。其中一个问题是,我需要使用许多简单的服务,其中XML根据我使用的REST调用略有不同。使用JAXB,我每次都必须创建一个全新的类层次结构来处理这个问题。这是非常丑陋和非常低效的编码时间方面。也许我只是需要更好地学习JAXB。。。对于生成服务,JAXB还使我的工作变得困难,因为我想公开的内容取决于访问的对象和方式。如果服务之间的XML有很多不同的变体,那么无论您使用JAXB注释类,除非您的所有元素都用“required=true”注释修饰,否则您可以省略不想生成的注释,JAXB将很乐意解析缺少可选元素的XML。它们的值将只是空值。这就是我最后要做的。@vtd xml作者:不知怎的,我觉得您可能有点偏见:)。但是,我确实听说了VTD-XML的优点。