前两节讲了socket服务端,客户端的建立以及报文的封装。今天就来讲一下java对象和xml格式文件的相互转换。
上一节中我们列举了一个报文格式,其实我们可以理解为其实就是一个字符串。但是我们不可能每次都去写字符串啊,这样的话肯定要疯。既然是面向对象的编程,肯定会有好的办法来解决这个问题。我们使用JAXBContext这个工具。以上两个方法可以将java对象可xml文件相互转换。
接下来我们看看怎么使用。
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;
}
}
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,我们建立测试方法:
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,00011
3)有时候我们的java对象中会存在集合,这时我们像如下这么做:
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对象和类对象。使用就是这么的简单^_^!!!
前两节讲了socket服务端,客户端的建立以及报文的封装。今天就来讲一下java对象和xml格式文件的相互转换。上一节中我们列举了一个报文格式,其实我们可以理解为其实就是一个字符串。但是我们不可能每次都去写字符串啊,这样的话肯定要疯。既然是面向对象的编程,肯定会有好的办法来解决这个问题。我们使用JAXBContext这个工具。
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文件相互转换。
接下来我们看看怎么使用。
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,我们建立测试方法:
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,00011
3)有时候我们的java对象中会存在集合,这时我们像如下这么做:
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对象和类对象。使用就是这么的简单^_^!!!