使用JAXB实现JAVA对象和XML字符串的互相转换实例

来源:互联网 发布:电脑怎么截图淘宝客服 编辑:程序博客网 时间:2024/06/10 07:46

测试类:

package com.yanek.test;import java.util.ArrayList;import java.util.List;import com.yanek.test.JaxbUtil.CollectionWrapper;public class Test {/** * @param args */public static void main(String[] args) {//创建java对象Hotel hotel=new Hotel();hotel.setId(1);hotel.setName("name1");RoomTypeVO t1=new RoomTypeVO();t1.setPrice("20");t1.setTypeid(1);t1.setTypename("typename1");RoomTypeVO t2=new RoomTypeVO();t2.setPrice("30");t2.setTypeid(2);t2.setTypename("typename2");List<RoomTypeVO> RoomTypeVOs=new ArrayList<RoomTypeVO>();RoomTypeVOs.add(t1);RoomTypeVOs.add(t2);hotel.setRoomTypeVOs(RoomTypeVOs);//将java对象转换为XML字符串JaxbUtil requestBinder = new JaxbUtil(Hotel.class,CollectionWrapper.class);String retXml = requestBinder.toXml(hotel, "utf-8");System.out.println("xml:"+retXml);//将xml字符串转换为java对象JaxbUtil resultBinder = new JaxbUtil(Hotel.class,CollectionWrapper.class);Hotel hotelObj = resultBinder.fromXml(retXml);System.out.println("hotelid:"+hotelObj.getId());System.out.println("hotelname:"+hotelObj.getName());for(RoomTypeVO roomTypeVO:hotelObj.getRoomTypeVOs()){System.out.println("Typeid:"+roomTypeVO.getTypeid());System.out.println("Typename:"+roomTypeVO.getTypename());}}}


输出如下:

xml:<?xml version="1.0" encoding="utf-8" standalone="yes"?><hotel id="1">    <name>name1</name>    <RoomTypeVOs>        <RoomTypeVO typeid="1">            <price>20</price>            <typename>typename1</typename>        </RoomTypeVO>        <RoomTypeVO typeid="2">            <price>30</price>            <typename>typename2</typename>        </RoomTypeVO>    </RoomTypeVOs></hotel>hotelid:1hotelname:name1Typeid:1Typename:typename1Typeid:2Typename:typename2


相关类:

package com.yanek.test;import java.util.List;import javax.xml.bind.annotation.XmlAttribute;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlElementWrapper;import javax.xml.bind.annotation.XmlRootElement;@XmlRootElement(name = "hotel")public class Hotel {@XmlElementWrapper(name = "RoomTypeVOs")@XmlElement(name = "RoomTypeVO")public List<RoomTypeVO> getRoomTypeVOs() {return RoomTypeVOs;}public void setRoomTypeVOs(List<RoomTypeVO> roomTypeVOs) {RoomTypeVOs = roomTypeVOs;}private List<RoomTypeVO> RoomTypeVOs;/////@XmlElement(name = "id")@XmlAttribute(name = "id")public int getId() {return id;}public void setId(int id) {this.id = id;}@XmlElement(name = "name")public String getName() {return name;}public void setName(String name) {this.name = name;}private int id;private String name;}package com.yanek.test;import javax.xml.bind.annotation.XmlAttribute;import javax.xml.bind.annotation.XmlElement;public class RoomTypeVO {///@XmlElement(name = "typeid")@XmlAttribute(name = "typeid")public int getTypeid() {return typeid;}public void setTypeid(int typeid) {this.typeid = typeid;}@XmlElement(name = "typename")public String getTypename() {return typename;}public void setTypename(String typename) {this.typename = typename;}@XmlElement(name = "price")public String getPrice() {return price;}public void setPrice(String price) {this.price = price;}private int typeid;private String typename;private String price;}

jaxb简单工具类:

package com.yanek.test;import java.io.StringReader;import java.io.StringWriter;import java.util.Collection;import javax.xml.bind.JAXBContext;import javax.xml.bind.JAXBElement;import javax.xml.bind.JAXBException;import javax.xml.bind.Marshaller;import javax.xml.bind.Unmarshaller;import javax.xml.bind.annotation.XmlAnyElement;import javax.xml.namespace.QName;import org.apache.commons.lang.StringUtils;/** * 使用Jaxb2.0实现XML<->Java Object的Binder. *  * 特别支持Root对象是List的情形. *  * @author */public class JaxbUtil {// 多线程安全的Context.private JAXBContext jaxbContext;/** * @param types *            所有需要序列化的Root对象的类型. */public JaxbUtil(Class<?>... types) {try {jaxbContext = JAXBContext.newInstance(types);} catch (JAXBException e) {throw new RuntimeException(e);}}/** * Java Object->Xml. */public String toXml(Object root, String encoding) {try {StringWriter writer = new StringWriter();createMarshaller(encoding).marshal(root, writer);return writer.toString();} catch (JAXBException e) {throw new RuntimeException(e);}}/** * Java Object->Xml, 特别支持对Root Element是Collection的情形. */@SuppressWarnings("unchecked")public String toXml(Collection root, String rootName, String encoding) {try {CollectionWrapper wrapper = new CollectionWrapper();wrapper.collection = root;JAXBElement<CollectionWrapper> wrapperElement = new JAXBElement<CollectionWrapper>(new QName(rootName), CollectionWrapper.class, wrapper);StringWriter writer = new StringWriter();createMarshaller(encoding).marshal(wrapperElement, writer);return writer.toString();} catch (JAXBException e) {throw new RuntimeException(e);}}/** * Xml->Java Object. */@SuppressWarnings("unchecked")public <T> T fromXml(String xml) {try {StringReader reader = new StringReader(xml);return (T) createUnmarshaller().unmarshal(reader);} catch (JAXBException e) {throw new RuntimeException(e);}}/** * Xml->Java Object, 支持大小写敏感或不敏感. */@SuppressWarnings("unchecked")public <T> T fromXml(String xml, boolean caseSensitive) {try {String fromXml = xml;if (!caseSensitive)fromXml = xml.toLowerCase();StringReader reader = new StringReader(fromXml);return (T) createUnmarshaller().unmarshal(reader);} catch (JAXBException e) {throw new RuntimeException(e);}}/** * 创建Marshaller, 设定encoding(可为Null). */public Marshaller createMarshaller(String encoding) {try {Marshaller marshaller = jaxbContext.createMarshaller();marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);if (StringUtils.isNotBlank(encoding)) {marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);}return marshaller;} catch (JAXBException e) {throw new RuntimeException(e);}}/** * 创建UnMarshaller. */public Unmarshaller createUnmarshaller() {try {return jaxbContext.createUnmarshaller();} catch (JAXBException e) {throw new RuntimeException(e);}}/** * 封装Root Element 是 Collection的情况. */public static class CollectionWrapper {@SuppressWarnings("unchecked")@XmlAnyElementprotected Collection collection;}}




3 0