xml转化java对象

JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。

一.Jaxb处理java对象和xml之间转换常用的annotation有:

@XmlType
@XmlElement
@XmlRootElement
@XmlAttribute
@XmlAccessorType

@XmlAccessorOrder
@XmlTransient
@XmlJavaTypeAdapter
二 常用的annotation
1.XmlType
@XmlType用在class类的注解,常与@XmlRootElement,@XmlAccessorType一起使用。它有三个属性:name、propOrder、namespace,经常使用的只有前两个属性。如:
@XmlType(name = "basicStruct", propOrder = {
    "intValue",
    "stringArray",
    "stringValue"
)
在使用@XmlType的propOrder 属性时,必须列出JavaBean对象中的所有属性,否则会报错。

2.@XmlElement

@XmlElement将java对象的属性映射为xml的节点,在使用@XmlElement时,可通过name属性改变java对象属性在xml中显示的名称。如:

@XmlElement(name="Address")  
private String yourAddress;
3.@XmlRootElement

@XmlRootElement用于类级别的注解,对应xml的跟元素,常与 @XmlType 和 @XmlAccessorType一起使用。如:
@XmlType
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Address {}
4.@XmlAttribute
@XmlAttribute用于把java对象的属性映射为xml的属性,并可通过name属性为生成的xml属性指定别名。如:
@XmlAttribute(name="Country")
private String state;
5.@XmlAccessorType
@XmlAccessorType用于指定由java对象生成xml文件时对java对象属性的访问方式。常与@XmlRootElement、@XmlType一起使用。它的属性值是XmlAccessType的4个枚举值,分   别为:
XmlAccessType.FIELD:java对象中的所有成员变量
XmlAccessType.PROPERTY:java对象中所有通过getter/setter方式访问的成员变量
XmlAccessType.PUBLIC_MEMBER:java对象中所有的public访问权限的成员变量和通过getter/setter方式访问的成员变量
XmlAccessType.NONE:java对象的所有属性都不映射为xml的元素
注意:@XmlAccessorType的默认访问级别是XmlAccessType.PUBLIC_MEMBER,因此,如果java对象中的private成员变量设置了public权限的getter/setter方法,就不要在private变量上使用@XmlElement和@XmlAttribute注解,否则在由java对象生成xml时会报同一个属性在java类里存在两次的错误。同理,如果@XmlAccessorType的访问权限为XmlAccessType.NONE,如果在java的成员变量上使用了@XmlElement或@XmlAttribute注解,这些成员变量依然可以映射到xml文件。

举个栗子:

ReqHeader.java

import javax.xml.bind.annotation.XmlElement;

public class ReqHeader {
    
    /**
     * 系统编号
     */
    private String sysId;    
    /**
     * 鉴权码
     */
    private String authCode;    
    /**
     * 流水号
     */
    private String reqNo;

    public String getSysId() {
        return sysId;
    }
    @XmlElement(name="SYSID")
    public void setSysId(String sysId) {
        this.sysId = sysId;
    }
    public String getAuthCode() {
        return authCode;
    }
    @XmlElement(name="AUTHCODE")
    public void setAuthCode(String authCode) {
        this.authCode = authCode;
    }
    public String getReqNo() {
        return reqNo;
    }
    @XmlElement(name="REQNO")
    public void setReqNo(String reqNo) {
        this.reqNo = reqNo;
    }
}
SmsBody.java
import javax.xml.bind.annotation.XmlElement;

public class SmsBody {
    
    /**
     * 短信内容
     */
    private String content;    
    /**
     * 手机号
     */
    private String sourceAddr;    
    /**
     * 服务代码
     */
    private String destAddr;

    public String getContent() {
        return content;
    }
    @XmlElement(name="CONTENT")
    public void setContent(String content) {
        this.content = content;
    }
    public String getSourceAddr() {
        return sourceAddr;
    }
    @XmlElement(name="SOURCEADDR")
    public void setSourceAddr(String sourceAddr) {
        this.sourceAddr = sourceAddr;
    }
    public String getDestAddr() {
        return destAddr;
    }
    @XmlElement(name="DESTADDR")
    public void setDestAddr(String destAddr) {
        this.destAddr = destAddr;
    }
}

SmsDeliverReq.java

import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="SMSDELIVERREQ")
public class SmsDeliverReq {
    
    private ReqHeader reqHeader;    
    private List<SmsBody> smsBodys;
	
    @XmlElement(name="REQHEADER")
    public ReqHeader getReqHeader() {
        return reqHeader;
    }
    public void setReqHeader(ReqHeader reqHeader) {
        this.reqHeader = reqHeader;
    }
    @XmlElementWrapper(name="SMSBODYS")
    @XmlElement(name="SMSBODY")
    public List<SmsBody> getSmsBodys() {
        return smsBodys;
    }
    public void setSmsBodys(List<SmsBody> smsBodys) {
        this.smsBodys = smsBodys;
    }
}
Test.java

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class TestXml {

    /**
     * XML转换为javabean
     * @param <T>
     * @param xml
     * @param t
     * @return
     * @throws JAXBException
     */
    public static <T> T xmlToBean(String xml, T t) throws JAXBException {
        JAXBContext context = JAXBContext.newInstance(t.getClass());
        Unmarshaller um = context.createUnmarshaller();
        StringReader sr = new StringReader(xml);
        t = (T) um.unmarshal(sr);
        return t;
    }

    /**
     * javabean转换为XML
     * @param smsDeliverReq
     * @return
     * @throws JAXBException
     * @throws FileNotFoundException
     */
    public static <T> StringWriter beanToXml(T t) throws JAXBException, FileNotFoundException {
        JAXBContext context = JAXBContext.newInstance(t.getClass());
        Marshaller m = context.createMarshaller();
        StringWriter sw = new StringWriter();
        m.marshal(t, sw);
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);//是否格式化
        m.marshal(t, new FileOutputStream("D:\\test.xml"));
        return sw;
    }

    /**
     * @param args
     * @throws JAXBException
     * @throws FileNotFoundException
     */
    public static void main(String[] args) throws JAXBException, FileNotFoundException {
        ReqHeader reqHeader = new ReqHeader();
        reqHeader.setReqNo("111");
        reqHeader.setAuthCode("DDDD");
        reqHeader.setSysId("jjj");

        SmsBody smsBody = new SmsBody();
        smsBody.setContent("类容讷讷");
        smsBody.setDestAddr("1589594");
        smsBody.setSourceAddr("9999");

        SmsBody smsBody1 = new SmsBody();
        smsBody1.setContent("asdf");
        smsBody1.setDestAddr("asdf");
        smsBody1.setSourceAddr("4fdf");


        SmsDeliverReq smsDeliverReq = new SmsDeliverReq();
        smsDeliverReq.setReqHeader(reqHeader);
        List<SmsBody> smsBodys = new ArrayList<SmsBody>();
        smsBodys.add(smsBody);
        smsBodys.add(smsBody1);
        smsDeliverReq.setSmsBodys(smsBodys);

        StringWriter sw = beanToXml(smsDeliverReq);
        System.out.println(sw.toString());

        SmsDeliverReq xmlToBean = xmlToBean(sw.toString(), smsDeliverReq);
        System.out.println(xmlToBean.toString());
        System.err.println(xmlToBean.getSmsBodys().get(0).getContent());
    }
}
JDK中JAXB相关的重要Class和Interface: 
JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。 
Marshaller接口,将Java对象序列化为XML数据。 
Unmarshaller接口,将XML数据反序列化为Java对象。 

JDK中JAXB相关的重要Annotation: 
@XmlType,将Java类或枚举类型映射到XML模式类型 
@XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标注)字段到XML。其他值还有XmlAccessType.PROPERTY和XmlAccessType.NONE。 
@XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。 
@XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。
@XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。 
@XmlRootElement,将Java类或枚举类型映射到XML元素。 
@XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素。 
@XmlAttribute,将Java类的一个属性映射到与属性同名的一个XML属性。 
其他: 
对于要序列化(marshal)为XML的Java类,绝不能把成员变量声明为public,否则运行将抛出异常com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException。 
对于JAXB相关的重要Annotation的声明,如@Xml.....,可以放在成员变量的setter()或getter()方法上,两者中任选其一即可,但决不能放在成员变量上,否则运行将抛出异常com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException。 

转载:http://www.cnblogs.com/zhaoyan001/p/6343375.html

转载: http://www.cnblogs.com/qiyebao/p/4573665.html


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值