利用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")
- @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());
- }
- }
- 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;
- }
- }
- @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;
- }
- }
- 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();
- }
- }
- 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);
- }
- }
- 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>