使用JAXB實現JAVA對象和XML字串的互相轉換執行個體

來源:互聯網
上載者:User

標籤:

測試類別:

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;}}




著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

使用JAXB實現JAVA對象和XML字串的互相轉換執行個體

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.