java對象與XML相互轉化


起因

  最近在公司做了一次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報文

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM