marshaller、unmarshaller解析xml及读取xml

来源:互联网 发布:kindle阅读器软件 编辑:程序博客网 时间:2024/05/24 04:09

一、简介:

本文主要介绍marshaller、unmarshaller的使用,并附上简单的实例,DOM解析和SAX解析大家应该众所周知,这里就不介绍了,自行百度或查看文档即可,marshaller简直就是神器,下面我们就来介绍一下。

首先,我们来介绍一下marshaller、unmarshaller有什么用,及API的简单介绍,JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了对XML的实例文档反向生成JAVA对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。

marshaller :

从官网文档来说,marshaller 类负责管理将Java内容树序列化为XML数据的过程。简单的来说可以把java对象序列话为转为XML格式的数据。

Unmarshaller:

从官网文档来说,Unmarshaller类管理将XML数据反序列化到新创建的Java内容树中的过程,在未编组的情况下,还可以对XML数据进行验证。简单的来说。可以把XML格式的数据反序列化并且把数据绑定在Java bean的属性上。

这里我直接上案例,需要了解更多的可以移步官网文档:marshaller unmarshaller

首先创建一个ReqHeader的类:

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;    }}


然后创建一个内容类:

public class SmsBody {    /**     * 短信内容     */    private String content;    /**     * 手机号     */    private String sourceAddr;        /**     * 服务代码     */    private String destAddr;    public String getContent() {        return content;    }    @XmlElement(name = "CONTEXT")    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;    }}


最后创建一个包装类:

@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;    }    /**     * 在JAXB标准中,@XmlElementWrapper注解表示生成一个包装 XML 表示形式的包装器元素。     * 此元素主要用于生成一个包装集合的包装器 XML 元素。因此,该注释支持两种形式的序列化。     * @XmlElementWrapper 仅允许出现在集合属性上     * @return     */    @XmlElementWrapper(name = "SMSBODYS")    @XmlElement(name = "SMSBODY")    public List<SmsBody> getSmsBodys() {        return smsBodys;    }    public void setSmsBodys(List<SmsBody> smsBodys) {        this.smsBodys = smsBodys;    }}


测试代码:

public class Test {    /**     * XML 转转为 JavaBean     * @param xml     * @param t     * @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 t     * @param <T>     * @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("/test.xml"));        m.marshal(t,System.out);        return sw;    }    public static void main(String[] args) throws JAXBException, FileNotFoundException {        ReqHeader reqHeader = new ReqHeader();        reqHeader.setReqNo("1");        reqHeader.setAuthCode("AAA");        reqHeader.setSysId("AAA123");        SmsBody smsBody = new SmsBody();        smsBody.setContent("测试1");        smsBody.setDestAddr("15888");        smsBody.setSourceAddr("888");        SmsBody smsBody1 = new SmsBody();        smsBody1.setContent("测试2");        smsBody1.setDestAddr("159898");        smsBody1.setSourceAddr("989898");        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.getSmsBodys());        System.out.println(xmlToBean.getSmsBodys().get(0).getContent());    }


生成的xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><SMSDELIVERREQ>    <REQHEADER>        <AUTHCODE>AAA</AUTHCODE>        <REQNO>1</REQNO>        <SYSID>AAA</SYSID>    </REQHEADER>    <SMSBODYS>        <SMSBODY>            <CONTEXT>测试1</CONTEXT>            <DATE>2017-07-03T16:05:56.722+08:00</DATE>            <DESTADDR>15888</DESTADDR>            <SOURCEADDR>888</SOURCEADDR>        </SMSBODY>        <SMSBODY>            <CONTEXT>测试2</CONTEXT>            <DESTADDR>159898</DESTADDR>            <SOURCEADDR>989898</SOURCEADDR>        </SMSBODY>    </SMSBODYS></SMSDELIVERREQ>


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属性。 

注意:序列化的java类的成员遍历不能声明为public的,

注意:@XmlElementWrapper仅允许出现在集合属性上。


原创粉丝点击