起因
最近在公司做了一次webservice相關的任務,其中我最敢興趣的就是webservice接受到XML對應的流以后是如何方便的轉化成java對象,而java對象又是如何生成對應的XML的.
目的
這篇文章的目的就是為了記錄一下: 當我和別人確定了XML的格式以后怎么最方便的將它映射到java對象上,java對象又如何生成對應的XML報文.
原理
java有XML和JAVA對象相互轉化的方法,那就是JAXB.除了jaxb之外開發過程中我還發現了一些小技巧,需要記錄一下.
具體
webservice服務之間數據格式如果是XML的話,那么最關鍵最首先要做的應該是先定下雙方的XML的格式.
如果XML已經有了,比如這樣:
2 <person> 3 <name>abc</name> 4 <age>24</age> 5 <computers> 6 <computer> 7 <name>p1</name> 8 <cpu>i3</cpu> 9 </computer> 10 <computer> 11 <name>p2</name> 12 <cpu>i5</cpu> 13 </computer> 14 <computer> 15 <name>p3</name> 16 <cpu>i7</cpu> 17 </computer> 18 </computers> 19 </person>
那么我們應該生成他對應的XSD文件.
XSD文件就是校驗XML用的,JAXB也需要用他生成java對象.
公司的做法是找個XSD模板,然后改改改.......簡單粗暴.....這樣的話模板需要和你的結構比較類似,不然改起來會很痛苦,自己寫過XSD的朋友應該都深有體會....反正當初我找了個單層的XSD模板,我的報文是3層嵌套的...我改完有N個BUG....各種校驗不通過....
其實有很多工具可以生成XSD文件,比如我現在就用XMLSPY
打開前面寫的XML報文以后可以自動生成相對應的XSD.
但是自動生成的XSD可能有些地方的校驗不是我們想要的,在這個工具里也可以比較方便的去調整,比如
比如computers下的computer這里自動生成的XSD要求是至少1個computer節點,最多無限個.如果我們的業務需求是最少可以沒有,最多無限個的話我們可以修改它滿足我們的條件(雖然似乎生成的java對象沒有什么區別)
然后XSD文檔就有了..有了XSD文檔以后只要生成利用JAVA自帶的XJC生成相應的java對象即可.網上有很多相關命令.
我是自己建一個.cmd文件,然后寫入
1 D:\jet\jdk1.7\jdk-7windows-x64\bin\xjc -d .\ test.xsd
即可.就是XJC的路徑,生成java文件目標地址,xsd地址.
然后運行就能生成java對象了.
最后寫個測試類來看看好不好用.
1 package test.jaxb; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.io.StringWriter; 6 7 import javax.xml.bind.JAXBContext; 8 import javax.xml.bind.JAXBException; 9 import javax.xml.bind.Marshaller; 10 import javax.xml.bind.Unmarshaller; 11 12 public class JAXBConverterTest { 13 public static void main(String[] args) throws IOException, JAXBException { 14 JAXBContext context = JAXBContext.newInstance(Person.class); 15 Unmarshaller unmarshaller = context.createUnmarshaller(); 16 Object obj = unmarshaller.unmarshal(new File("C:/Users/Administrator/Desktop/jaxb/test.xml")); 17 System.out.println(obj); 18 19 System.out.println("======================="); 20 21 StringWriter sw = new StringWriter(); 22 Marshaller marshaller = context.createMarshaller(); 23 marshaller.marshal(obj, sw); 24 System.out.println(sw.toString()); 25 } 26 }
Person [name=abc, age=24, computers=Computers [computer=[Computer [name=p1, cpu=i3], Computer [name=p2, cpu=i5], Computer [name=p3, cpu=i7]]]] ======================= <?xml version="1.0" encoding="UTF-8" standalone="yes"?><person><name>abc</name><age>24</age><computers><computer><name>p1</name><cpu>i3</cpu></computer><computer><name>p2</name><cpu>i5</cpu></computer><computer><name>p3</name><cpu>i7</cpu></computer></computers></person>
看來效果不錯.
小結
webservice開發流程小結:先定下XML報文 -> 利用工具生成XSD -> XJC生成java對象 -> 調用JAXB相關方法轉化java對象和XML報文