JAXB 实现java对象与xml之间互相转换

来源:互联网 发布:使用动态规划的算法 编辑:程序博客网 时间:2024/05/16 17:11

利用Marshaller和unMarshaller可在java的object对象和xml之间实现转换
首先创建一个简单的Boy对象
@XmlRootElement(name="Root")  @XmlAccessorType(XmlAccessType.PROPERTY)  public class Boy {            private String name = "aa";        public String getName() {          return name;      }        public void setName(String name) {          this.name = name;      }        }  


 


其中@XmlRootElement(name="Root")表明xml的根元素,(name="Root")这个是重新定义xml文件的跟元素,如果没有此name定义,则xml根元素默认跟对象名一致
然后通过Marshaller类实现将对象转换为xml,同时也可利用Unmarshaller类进行xml和类之间的转换
public class JAXBTest {        public static void main(String[] args) throws JAXBException {          JAXBContext context = JAXBContext.newInstance(Boy.class);                    Marshaller marshaller = context.createMarshaller();          Unmarshaller unMarshaller = context.createUnmarshaller();                    System.out.println("----------marshaller--------------");          Boy boy = new Boy();          marshaller.marshal(boy, System.out);                    System.out.println("\n----------unMarshaller--------------");          //将xml转换为对应的java对象           String xml = "<Root><name>aa</name></Root>";//此处标签名称须和boy对象的属性一致           Boy b = (Boy) unMarshaller.unmarshal(new StringReader(xml));          System.out.println(b.getName());      }        }  




最后转换打印结果
----------marshaller--------------
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Root><name>aa</name></Root>
----------unMarshaller--------------
aa


上面介绍的对象boy中只包含简单属性,如果boy中还包含其他对象该做如何处理呢?
@XmlRootElement(name="Root")  @XmlAccessorType(XmlAccessType.PROPERTY)  public class Boy {            private String name = "aa";      private Address address;            public String getName() {          return name;      }        public void setName(String name) {          this.name = name;      }            @XmlJavaTypeAdapter(AddressAdapter.class)      public Address getAddress() {          return address;      }            public void setAddress(Address address) {          this.address = address;      }  } 
public class Address {        private String address;            public void setAddress(String address) {          this.address = address;      }        public String getAddress() {          return address;      }    }  



此时的boy对象中包含了Address对象,所以此时boy对象中的getAddress()须设置adapter,
创建AddressAdapter类,继承XmlAdapter<ValueType,BoundType>
public class AddressAdapter extends XmlAdapter<String, Address> {        @Override      public Address unmarshal(String v) throws Exception {          AddressImpl address = new AddressImpl();          address.setAddress(v);          return address;      }        @Override      public String marshal(Address v) throws Exception {          return v.getAddress();      }    }  

此时即可进行java对象转换为xml
public class JAXBTest {        public static void main(String[] args) throws JAXBException {          JAXBContext context = JAXBContext.newInstance(Boy.class);                    Marshaller marshaller = context.createMarshaller();                    System.out.println("----------marshaller--------------");          Boy boy = new Boy();          AddressImpl address = new AddressImpl();          address.setAddress("BeiJing");          boy.setAddress(address);          marshaller.marshal(boy, System.out);                }        }  





最后打印结果为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Root><address>BeiJing</address><name>aa</name></Root>

0 0
原创粉丝点击