java socket报文通信(三)java对象和xml格式文件的相互转换
来源:互联网 发布:app切图软件 编辑:程序博客网 时间:2024/05/22 08:09
url:http://www.cnblogs.com/mouseIT/p/4190054.html
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工具类 */@XmlRootElementpublic 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中的namepublic 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对象和类对象。使用就是这么的简单^_^!!!
0 0
- java socket报文通信(三)java对象和xml格式文件的相互转换
- java socket报文通信(三)java对象和xml格式文件的相互转换
- java socket报文通信(三)java对象和xml格式文件的相互转换
- java socket报文通信(三)java对象和xml格式文件的相互转换
- 关于java实体在xml报文和json报文之间的相互转换
- java对象和xml对象的相互转换
- java socket报文通信-报文的封装
- XML 和 java对象相互转换
- XML 和 java对象相互转换
- XML 和 java对象相互转换
- XML 和 java对象相互转换
- JAXB-java对象和xml相互转换
- XML 和 java对象相互转换
- Java对象和XML相互转换
- XML 和 java对象相互转换
- java socket报文通信(二)报文的封装
- java socket报文通信(二)报文的封装
- java socket报文通信(二)报文的封装
- SDAU 课程练习3 1020
- 数据结构—顺序表—删除某个元素
- 一起学Netty(一)之 Hello Netty
- 技术团队负责人应该具备怎样的能力
- 2017考研视屏资料计算机考研
- java socket报文通信(三)java对象和xml格式文件的相互转换
- 存储过程在数据库中的作用
- 为PPT架构师正名
- ViewPager添加导航栏
- Android Studio使用build.gradle修改签名后的apk默认名称
- linux不知道账户密码,强制找回 和 WordPress 没有阅读量和 定时器发布失败的处理
- iOS常用技术 - 解决App上下黑边问题
- Leetcode题解14 237. Delete Node in a Linked List
- spark rdd