當前使用Java的內置XML DOM庫進行創建/解析。醜陋的,即使有很多輔助類和方法,性能和內存使用也很糟糕。用於生成/消費REST服務的最佳Java XML解析器
在生產和使用REST服務方面,處理XML的最佳Java工具或框架是什麼?
我使用的服務使用JAXB。我能夠使用他們的課程,並且方便,便捷地使用他們的服務。這很漂亮,但在大多數情況下JAXB仍然很痛苦。所以我研究了StAX和VTD-XML。 StAX在大約4年後還沒有更新。 VTD-XML是Java中XML處理的最新技術?
當前使用Java的內置XML DOM庫進行創建/解析。醜陋的,即使有很多輔助類和方法,性能和內存使用也很糟糕。用於生成/消費REST服務的最佳Java XML解析器
在生產和使用REST服務方面,處理XML的最佳Java工具或框架是什麼?
我使用的服務使用JAXB。我能夠使用他們的課程,並且方便,便捷地使用他們的服務。這很漂亮,但在大多數情況下JAXB仍然很痛苦。所以我研究了StAX和VTD-XML。 StAX在大約4年後還沒有更新。 VTD-XML是Java中XML處理的最新技術?
我可以推薦Spring MVC 3+。 REST服務提供了開箱即用的支持。這需要幾分鐘的時間來創建REST服務如果你知道春天...
http://blog.springsource.com/2009/03/08/rest-in-spring-3-mvc/
您應該能夠編寫JAXB註釋類,Jersey支持這些開箱即用的功能,並自動爲您解析它們。它可能不是最高性能的解決方案,但它是一個非常好的清潔應用程序。
除非你能證明你有性能問題(並且可以跟蹤它到JAXB),否則我不會擔心編組/解開開銷。
編輯:
JAXB帶註釋的類可能非常簡單。建模XML像;
<customer>
<name>Fred</name>
<email>[email protected]</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("[email protected]");
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也會讓我生活變得艱難,因爲我想根據誰被訪問以及如何訪問我想暴露的變化。 – 2010-10-11 12:28:10
如果您在服務之間的XML中有很多不同的變體,那麼無論是使用JAXB註釋類還是手動分析XML,您都必須以任何方式完成工作。 – Qwerky 2010-10-11 12:50:15
除非您的所有元素都用「required = true」註釋進行了修飾,否則您可以省略那些您不想生成的元素,JAXB會高興地解析缺少可選元素的XML。它們的值將簡單地爲空。 – 2013-03-08 21:10:54
StAX由於不需要長時間沒有更新。 XML格式沒有改變,StAX是一種相當簡單的格式映射到API。隨着低級XML API的推出,使用起來非常簡單,我相信它非常高效。然而,它是一個非常低級的API。它(非常粗略)是用於編寫二進制數據的DataInputStream和DataOutputSteam的XML等價物;使用它編寫的代碼必須在元素,屬性等的概念層面編寫。我沒有使用過VTD-XML,但看起來差不多。
如果您想使用更高級別的內容,那麼請查看一些XML序列化工具,例如XStream - 您可以編寫一些類,通過適當的轉換定製,可以從您的傳入中讀取數據?那麼你可以使用相同的類來進行細微差別的輸入,而忽略的字段會被忽略嗎?事實上,您可以使用JAXB中的'缺少XML元素被忽略'的方法嗎?我不知道模式有多嚴格,或者你的投入是否可以這樣處理。我非常喜歡在黑暗中拍攝。
與vtd-xml相比,stax令人難以置信地更加難以使用...... – 2010-12-21 01:29:08
@ vtd-xml-author:不知何故,我明白你可能會有點偏頗:)。但是當然,我聽說過有關VTD-XML的好處。 – 2010-12-21 11:55:41
這就是我最終做的。 – 2010-10-11 20:57:34