java socket報文通訊(三)java對象和xml格式文件的相互轉換

前兩節講了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對象和類對象。使用就是這麼的簡單^_^!!!

相關文章
相關標籤/搜索