前兩節講了socket服務端,客戶端的創建以及報文的封裝。今天就來說一下java對象和xml格式文件的相互轉換。java
上一節中咱們列舉了一個報文格式,其實咱們能夠理解爲其實就是一個字符串。可是咱們不可能每次都去寫字符串啊,這樣的話確定要瘋。既然是面向對象的編程,確定會有好的辦法來解決這個問題。咱們使用JAXBContext這個工具。編程
package cn.com.egj.entity.shortcutTransfer.test; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringReader; import java.net.URLEncoder; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamWriter; /** * Jaxb2工具類 */ @XmlRootElement public class JaxbUtil { /** * JavaBean轉換成xml * * @param obj * @param encoding * @return */ public static String convertToXml(Object obj) { try { JAXBContext context = JAXBContext.newInstance(obj.getClass()); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK"); marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); ByteArrayOutputStream baos = new ByteArrayOutputStream(); //注意jdk版本 XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newInstance(); XMLStreamWriter xmlStreamWriter = xmlOutputFactory .createXMLStreamWriter(baos, (String) marshaller .getProperty(Marshaller.JAXB_ENCODING)); xmlStreamWriter.writeStartDocument( (String) marshaller.getProperty(Marshaller.JAXB_ENCODING), "1.0"); marshaller.marshal(obj, xmlStreamWriter); xmlStreamWriter.writeEndDocument(); xmlStreamWriter.close(); return new String(baos.toString("GBK")); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * xml轉換成JavaBean * * @param xml * @param c * @return */ @SuppressWarnings("unchecked") public static <T> T converyToJavaBean(String xml, Class<T> c) { T t = null; try { JAXBContext context = JAXBContext.newInstance(c); Unmarshaller unmarshaller = context.createUnmarshaller(); t = (T) unmarshaller.unmarshal(new StringReader(xml)); } catch (Exception e) { e.printStackTrace(); } return t; } }
以上兩個方法能夠將java對象可xml文件相互轉換。app
接下來咱們看看怎麼使用。socket
1)首先咱們要創建須要轉換的類:函數
import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; @XmlAccessorType(XmlAccessType.FIELD)//表示使用這個類中的 private 非靜態字段做爲 XML 的序列化的屬性或者元素,對應屬性要使用get、set方法。 @XmlRootElement(name="ROOT") @XmlType(propOrder={"code","name","age"})//xml格式數據的顯示的順序名字要和定義變量的同樣,而不是@XmlElement中的name public class MySocket { @XmlElement(name="Code",required=true)//定義xml中顯示的數據 private String code; @XmlElement(name="Name",required=true) private String name; @XmlElement(name="Age",required=true) private String age; public String getCode() { return code; } public String getName() { return name; } public String getAge() { return age; } public void setCode(String code) { this.code = code; } public void setName(String name) { this.name = name; } public void setAge(String age) { this.age = age; } public String toString(){ return this.name+","+this.age+","+this.code; } }
2)創建測試類:工具
public class Test { public static void main(String[] args) { objectToXml(); } public static void objectToXml(){ MySocket mySocket = new MySocket(); mySocket.setName("張三"); mySocket.setCode("00012"); mySocket.setAge("25"); String xml = JaxbUtil.convertToXml(mySocket); System.out.println(xml); } }
運行測試類,咱們將看到控制檯輸出:<?xml version="1.0" encoding="GBK"?><ROOT><Code>00012</Code><Age>25</Age></ROOT>測試
對於Object轉xml,咱們創建測試方法:ui
public static void xmlToObjetct(){ String xml = "<?xml version=\"1.0\" encoding=\"GBK\"?><ROOT><Code>00011</Code><Name>李四</Name><Age>26</Age></ROOT>"; MySocket mySocket= JaxbUtil.converyToJavaBean(xml, MySocket.class); System.out.println(mySocket.toString()); }
運行測試類,咱們將看到控制檯輸出:李四,26,00011this
3)有時候咱們的java對象中會存在集合,這時咱們像以下這麼作:spa
3.1)首先咱們創建袋集合的對象:
@XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name="ROOT") @XmlType(propOrder={"name","age","books"}) public class ListSocket { @XmlElement(name="Name",required=true) private String name; @XmlElement(name="Age",required=true) private String age; @XmlElementWrapper(name="ROWS")//@XmlElementWrapper註解表示生成一個包裝 XML 表示形式的包裝器元素。 此元素主要用於生成一個包裝集合的包裝器 XML 元素 @XmlElement(name="LIST",required=true) private List<Book> books; public String getName() { return name; } public String getAge() { return age; } public List<Book> getBooks() { return books; } public void setName(String name) { this.name = name; } public void setAge(String age) { this.age = age; } public void setBooks(List<Book> books) { this.books = books; } public String toString(){ String result = ""; result=this.age+","+this.name+",集合的數據:"; for (Book book:books) { result+=book.getAuthor()+book.getTime()+book.getBookName(); } return result; } }
@XmlAccessorType(XmlAccessType.FIELD) @XmlType(propOrder={"bookName","time","author"}) public class Book { @XmlElement(name="BookName") private String bookName; @XmlElement(name="Time") private String time; @XmlElement(name="Author") private String author; public String getBookName() { return bookName; } public String getTime() { return time; } public String getAuthor() { return author; } public void setBookName(String bookName) { this.bookName = bookName; } public void setTime(String time) { this.time = time; } public void setAuthor(String author) { this.author = author; } }
3.2)創建測試類:
public class ListSocketTest { public static void main(String[] args) { objectToXml(); xmlToObject(); } public static void objectToXml(){ ListSocket listSocket = new ListSocket(); listSocket.setName("張三"); listSocket.setAge("26"); List<Book> books = new ArrayList<Book>(); Book book1 = new Book(); book1.setAuthor("做者1"); book1.setTime("2014-12-28"); book1.setBookName("How to use JAXB"); Book book2= new Book(); book2.setAuthor("做者2"); book2.setTime("2014-06-06"); book2.setBookName("How to use SOCKET"); books.add(book1); books.add(book2); listSocket.setBooks(books); String xml = JaxbUtil.convertToXml(listSocket); System.out.println(xml); } public static void xmlToObject(){ String xml = "<?xml version=\"1.0\" encoding=\"GBK\"?><ROOT><Name>張三</Name><Age>26</Age><ROWS><LIST>"
+"<BookName>How to use JAXB</BookName><Time>2014-12-28</Time><Author>做者1</Author>"
+"</LIST><LIST><BookName>How to use SOCKET</BookName><Time>2014-06-06</Time><Author>做者2</Author></LIST></ROWS></ROOT>"; ListSocket listSocket = JaxbUtil.converyToJavaBean(xml, ListSocket.class); System.out.println(listSocket); }
運行主函數,咱們能夠看見轉換後的xml對象和類對象。使用就是這麼的簡單^_^!!!