標籤:jaxb xml轉換對象 java轉xml
測試類別:
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;}}