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

  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3.   
  4. import com.yanek.test.JaxbUtil.CollectionWrapper;  
  5.   
  6.   
  7. public class Test {  
  8.   
  9.     /** 
  10.      * @param args 
  11.      */  
  12.     public static void main(String[] args) {  
  13.   
  14.         //创建java对象  
  15.           
  16.         Hotel hotel=new Hotel();  
  17.         hotel.setId(1);  
  18.         hotel.setName("name1");  
  19.   
  20.         RoomTypeVO t1=new RoomTypeVO();  
  21.         t1.setPrice("20");  
  22.         t1.setTypeid(1);  
  23.         t1.setTypename("typename1");  
  24.           
  25.         RoomTypeVO t2=new RoomTypeVO();  
  26.         t2.setPrice("30");  
  27.         t2.setTypeid(2);  
  28.         t2.setTypename("typename2");  
  29.           
  30.   
  31.         List<RoomTypeVO> RoomTypeVOs=new ArrayList<RoomTypeVO>();  
  32.         RoomTypeVOs.add(t1);  
  33.         RoomTypeVOs.add(t2);  
  34.         hotel.setRoomTypeVOs(RoomTypeVOs);  
  35.   
  36.           
  37.         //将java对象转换为XML字符串  
  38.         JaxbUtil requestBinder = new JaxbUtil(Hotel.class,  
  39.                 CollectionWrapper.class);  
  40.         String retXml = requestBinder.toXml(hotel, "utf-8");  
  41.         System.out.println("xml:"+retXml);  
  42.           
  43.         //将xml字符串转换为java对象  
  44.         JaxbUtil resultBinder = new JaxbUtil(Hotel.class,  
  45.                 CollectionWrapper.class);  
  46.         Hotel hotelObj = resultBinder.fromXml(retXml);  
  47.           
  48.           
  49.           
  50.         System.out.println("hotelid:"+hotelObj.getId());  
  51.         System.out.println("hotelname:"+hotelObj.getName());  
  52.         for(RoomTypeVO roomTypeVO:hotelObj.getRoomTypeVOs())  
  53.         {  
  54.             System.out.println("Typeid:"+roomTypeVO.getTypeid());  
  55.             System.out.println("Typename:"+roomTypeVO.getTypename());  
  56.         }  
  57.   
  58.           
  59.     }  
  60.   
    1. 实体类:import java.util.List;  
    2.   
    3. import javax.xml.bind.annotation.XmlAttribute;  
    4. import javax.xml.bind.annotation.XmlElement;  
    5. import javax.xml.bind.annotation.XmlElementWrapper;  
    6. import javax.xml.bind.annotation.XmlRootElement;  
    7.   
    8. @XmlRootElement(name = "hotel")  
    9. public class Hotel {  
    10.     @XmlElementWrapper(name = "RoomTypeVOs")  
    11.     @XmlElement(name = "RoomTypeVO")  
    12.     public List<RoomTypeVO> getRoomTypeVOs() {  
    13.         return RoomTypeVOs;  
    14.     }  
    15.     public void setRoomTypeVOs(List<RoomTypeVO> roomTypeVOs) {  
    16.         RoomTypeVOs = roomTypeVOs;  
    17.     }  
    18.     private List<RoomTypeVO> RoomTypeVOs;  
    19.       
    20.     /@XmlElement(name = "id")  
    21.     @XmlAttribute(name = "id")  
    22.     public int getId() {  
    23.         return id;  
    24.     }  
    25.     public void setId(int id) {  
    26.         this.id = id;  
    27.     }  
    28.     @XmlElement(name = "name")  
    29.     public String getName() {  
    30.         return name;  
    31.     }  
    32.     public void setName(String name) {  
    33.         this.name = name;  
    34.     }  
    35.     private int id;  
    36.     private String name;  
    37.       
    38.   
    39. }  
    40.   
    41.   
    42.   
    43.   
    44. import javax.xml.bind.annotation.XmlAttribute;  
    45. import javax.xml.bind.annotation.XmlElement;  
    46.   
    47. public class RoomTypeVO {  
    48.       
    49.     ///@XmlElement(name = "typeid")  
    50.     @XmlAttribute(name = "typeid")  
    51.     public int getTypeid() {  
    52.         return typeid;  
    53.     }  
    54.     public void setTypeid(int typeid) {  
    55.         this.typeid = typeid;  
    56.     }  
    57.     @XmlElement(name = "typename")  
    58.     public String getTypename() {  
    59.         return typename;  
    60.     }  
    61.     public void setTypename(String typename) {  
    62.         this.typename = typename;  
    63.     }  
    64.     @XmlElement(name = "price")  
    65.     public String getPrice() {  
    66.         return price;  
    67.     }  
    68.     public void setPrice(String price) {  
    69.         this.price = price;  
    70.     }  
    71.     private int typeid;  
    72.     private String typename;  
    73.     private String price;  
    74.   
    75. }  
  61. }  



  1. jaxb简单工具类:

  2. import java.io.StringReader;  
  3. import java.io.StringWriter;  
  4. import java.util.Collection;  
  5.   
  6. import javax.xml.bind.JAXBContext;  
  7. import javax.xml.bind.JAXBElement;  
  8. import javax.xml.bind.JAXBException;  
  9. import javax.xml.bind.Marshaller;  
  10. import javax.xml.bind.Unmarshaller;  
  11. import javax.xml.bind.annotation.XmlAnyElement;  
  12. import javax.xml.namespace.QName;  
  13.   
  14. import org.apache.commons.lang.StringUtils;  
  15.   
  16. /** 
  17.  * 使用Jaxb2.0实现XML<->Java Object的Binder. 
  18.  *  
  19.  * 特别支持Root对象是List的情形. 
  20.  *  
  21.  * @author 
  22.  */  
  23. public class JaxbUtil {  
  24.     // 多线程安全的Context.  
  25.     private JAXBContext jaxbContext;  
  26.   
  27.     /** 
  28.      * @param types 
  29.      *            所有需要序列化的Root对象的类型. 
  30.      */  
  31.     public JaxbUtil(Class<?>... types) {  
  32.         try {  
  33.             jaxbContext = JAXBContext.newInstance(types);  
  34.         } catch (JAXBException e) {  
  35.             throw new RuntimeException(e);  
  36.         }  
  37.     }  
  38.   
  39.     /** 
  40.      * Java Object->Xml. 
  41.      */  
  42.     public String toXml(Object root, String encoding) {  
  43.         try {  
  44.             StringWriter writer = new StringWriter();  
  45.             createMarshaller(encoding).marshal(root, writer);  
  46.             return writer.toString();  
  47.         } catch (JAXBException e) {  
  48.             throw new RuntimeException(e);  
  49.         }  
  50.     }  
  51.   
  52.     /** 
  53.      * Java Object->Xml, 特别支持对Root Element是Collection的情形. 
  54.      */  
  55.     @SuppressWarnings("unchecked")  
  56.     public String toXml(Collection root, String rootName, String encoding) {  
  57.         try {  
  58.             CollectionWrapper wrapper = new CollectionWrapper();  
  59.             wrapper.collection = root;  
  60.   
  61.             JAXBElement<CollectionWrapper> wrapperElement = new JAXBElement<CollectionWrapper>(  
  62.                     new QName(rootName), CollectionWrapper.class, wrapper);  
  63.   
  64.             StringWriter writer = new StringWriter();  
  65.             createMarshaller(encoding).marshal(wrapperElement, writer);  
  66.   
  67.             return writer.toString();  
  68.         } catch (JAXBException e) {  
  69.             throw new RuntimeException(e);  
  70.         }  
  71.     }  
  72.   
  73.     /** 
  74.      * Xml->Java Object. 
  75.      */  
  76.     @SuppressWarnings("unchecked")  
  77.     public <T> T fromXml(String xml) {  
  78.         try {  
  79.             StringReader reader = new StringReader(xml);  
  80.             return (T) createUnmarshaller().unmarshal(reader);  
  81.         } catch (JAXBException e) {  
  82.             throw new RuntimeException(e);  
  83.         }  
  84.     }  
  85.   
  86.     /** 
  87.      * Xml->Java Object, 支持大小写敏感或不敏感. 
  88.      */  
  89.     @SuppressWarnings("unchecked")  
  90.     public <T> T fromXml(String xml, boolean caseSensitive) {  
  91.         try {  
  92.             String fromXml = xml;  
  93.             if (!caseSensitive)  
  94.                 fromXml = xml.toLowerCase();  
  95.             StringReader reader = new StringReader(fromXml);  
  96.             return (T) createUnmarshaller().unmarshal(reader);  
  97.         } catch (JAXBException e) {  
  98.             throw new RuntimeException(e);  
  99.         }  
  100.     }  
  101.   
  102.     /** 
  103.      * 创建Marshaller, 设定encoding(可为Null). 
  104.      */  
  105.     public Marshaller createMarshaller(String encoding) {  
  106.         try {  
  107.             Marshaller marshaller = jaxbContext.createMarshaller();  
  108.   
  109.             marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);  
  110.   
  111.             if (StringUtils.isNotBlank(encoding)) {  
  112.                 marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);  
  113.             }  
  114.             return marshaller;  
  115.         } catch (JAXBException e) {  
  116.             throw new RuntimeException(e);  
  117.         }  
  118.     }  
  119.   
  120.     /** 
  121.      * 创建UnMarshaller. 
  122.      */  
  123.     public Unmarshaller createUnmarshaller() {  
  124.         try {  
  125.             return jaxbContext.createUnmarshaller();  
  126.         } catch (JAXBException e) {  
  127.             throw new RuntimeException(e);  
  128.         }  
  129.     }  
  130.   
  131.     /** 
  132.      * 封装Root Element 是 Collection的情况. 
  133.      */  
  134.     public static class CollectionWrapper {  
  135.         @SuppressWarnings("unchecked")  
  136.         @XmlAnyElement  
  137.         protected Collection collection;  
  138.     }  




    1. 输出如下:
    2. xml:
    3. <?xml version="1.0" encoding="utf-8" standalone="yes"?>  
    4. <hotel id="1">  
    5.     <name>name1</name>  
    6.     <RoomTypeVOs>  
    7.         <RoomTypeVO typeid="1">  
    8.             <price>20</price>  
    9.             <typename>typename1</typename>  
    10.         </RoomTypeVO>  
    11.         <RoomTypeVO typeid="2">  
    12.             <price>30</price>  
    13.             <typename>typename2</typename>  
    14.         </RoomTypeVO>  
    15.     </RoomTypeVOs>  
    16. </hotel>  
    17.   
    18.   
    19. hotelid:1  
    20. hotelname:name1  
    21. Typeid:1  
    22. Typename:typename1  
    23. Typeid:2  
    24. Typename:typename2  
     

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以使用JAXBJava Architecture for XML Binding)来实现XML字符串Java对象之间的转换。 1. 将Java对象转换XML字符串 使用JAXB的Marshaller类可以将Java对象转换XML字符串。以下是一个示例代码: ```java // 创建JAXBContext对象 JAXBContext jaxbContext = JAXBContext.newInstance(Student.class); // 创建Marshaller对象 Marshaller marshaller = jaxbContext.createMarshaller(); // 设置Marshaller的属性 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 将Java对象转换XML字符串 Student student = new Student("Tom", 18); StringWriter writer = new StringWriter(); marshaller.marshal(student, writer); String xmlString = writer.toString(); System.out.println(xmlString); ``` 2. 将XML字符串转换Java对象 使用JAXB的Unmarshaller类可以将XML字符串转换Java对象。以下是一个示例代码: ```java // 创建JAXBContext对象 JAXBContext jaxbContext = JAXBContext.newInstance(Student.class); // 创建Unmarshaller对象 Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); // 将XML字符串转换Java对象 String xmlString = "<student><name>Tom</name><age>18</age></student>"; StringReader reader = new StringReader(xmlString); Student student = (Student) unmarshaller.unmarshal(reader); System.out.println(student.getName() + ", " + student.getAge()); ``` 需要注意的是,在将Java对象转换XML字符串和将XML字符串转换Java对象时,都需要先创建JAXBContext对象JAXBContext是线程安全的,因此建议在应用程序启动时创建一次即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值