XmlRootElement

XmlRootElement

文章分类:Java编程

JAXB :  Java API for XML Binding

 

作用是 java对象 <--->xml文件  之间的转换

 

JAXB Annotation

@XmlRootElement   //xml 文件的根元素

@XmlElement

@XmlAccessorType  // 表明类内,什么样的成员 是可以被xml 转化 传输的  可以是FIELD PROPERTY ...

@XmlTransient

@XmlJavaTypeAdaptor

 

=========================================

 

下面是一个例子:

 

Boy.java

 

package jaxb;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlAccessType;

@XmlRootElement // 必须要标明这个元素
@XmlAccessorType(XmlAccessType.FIELD)
public class Boy{   
    String name= "CY";
}

JAXBTest.java

 

package jaxb;

import java.io.StringReader;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class JAXBTest {

    publicstatic void main(String[] args) throws JAXBException {
       JAXBContextcontext = JAXBContext.newInstance(Boy.class);
      
       Marshallermarshaller = context.createMarshaller();
       Unmarshallerunmarshaller = context.createUnmarshaller();
      
       Boy boy =new Boy();
      marshaller.marshal(boy, System.out);
      System.out.println();
      
       Stringxml ="<boy><name>David</name></boy>";
       Boy boy2 =(Boy) unmarshaller.unmarshal(new StringReader(xml));
      System.out.println(boy2.name);
    }
}

下面是运行结果:

<?xml version="1.0"encoding="UTF-8"standalone="yes"?><boy><name>CY</name></boy>
David
先 是marshall成 xml文件,

再是把 xml 文件 unmarshal 成 javaobject。

 

--------------------------------------------------

 

改动一:

@XmlAccessorType(XmlAccessType.FIELD) --> @XmlAccessorType(XmlAccessType.PROPERTY)

意思是 只有 属性 才能被转换成 xml 中的标签。

所以再运行的结果是:

<?xml version="1.0"encoding="UTF-8"standalone="yes"?><boy/>
CY

就是说 java object 转换成 xml 的时候,name不是属性(因为没有 get set方法),所以name不转换成标签。

 

-----------------------------------------------------

 

改动二:

改动一 的基础上,给name属性添加 get set 方法。 再运行,结果为:

<?xml version="1.0"encoding="UTF-8"standalone="yes"?><boy><name>CY</name></boy>
David
由 此 可见 @XmlAccessorType 这个annotation的作用。

 

-----------------------------------------------------

 

改动三:

改动二 的基础上,给Boy 再添加一个field, int age=10, 即:

 

package jaxb;

import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlAccessType;

@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Boy{   
    String name= "CY";
    intage = 10;
    publicString getName() {
       returnname;
    }
    public voidsetName(String name) {
       this.name =name;
    }
}

 

显然,这个age 是不会被 转化 到xml文件中的。解决办法是:

 

import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlAccessType;

@XmlRootElement // bixude
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Boy {
   
    String name= "CY";
   @XmlElement
    int age =10;

    publicString getName() {
       returnname;
    }

    public voidsetName(String name) {
       this.name =name;
    }

}

加上 @XmlElement annotation.运行结果为:

<?xml version="1.0"encoding="UTF-8"standalone="yes"?><boy><age>10</age><name>CY</name></boy>
David

 

--------------------------------------

 

对于根元素,可以设置属性:

@XmlRootElement(name="b" nameSpace="http://test")

这样,在生成的xml文件中,<boy> 标签 就会变为<b> 标签。并且加上一个命名空间。

 

----------------------------------------

 

下面解释 @XmlJavaTypeAdaptor 的作用。

 

@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Boy {
   
    privateString name = "CY";

 

    privateAddress address; // 是一个接口
   
    publicString getName() {
       returnname;
    }

    public voidsetName(String name) {
       this.name =name;
    }

}

 

在 java object 转换成 xml 的时候,接口Address无法被转换。

所以 这里要加上 @XmlJavaTypeAdapter(AddressAdapter.class)

所以 要多写一个AddressAdaptor 类。

这个类会返回Address接口的一个具体实现类的对象。

 

这 就是 @XmlJavaTypeAdapter 的作用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值