zoukankan      html  css  js  c++  java
  • marshaller unmarshaller解析xml和读取xml

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

    介绍下相关的类。SmsDeliverReq是一个请求对象,类中有两个属性,分别为ReqHeader reqHeader和List<SmsBody> smsBodys。ReqHeader和SmsBody都为自定义类型。这两个类中的属性都为基本数据类型。

    现在需要做的是将SmsDeliverReq的实例转换为xml和将xml转换为SmsDeliverReq实例,Test.java中封装了xml->javabean 和 javabean->xml的两个方法。并且实现了将生成的xml格式的字符串保存到xml文件中 

    ReqHeader.java

    package cn.mr.javabeanxml;
    
    import javax.xml.bind.annotation.XmlElement;
    
    /**
     * 请求头对象
     * @author xuejiangtao
     * Jul 25, 2013 9:33:57 PM
     */
    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

    package cn.mr.javabeanxml;
    
    import javax.xml.bind.annotation.XmlElement;
    
    /**
     * 请求内容
     * @author xuejiangtao
     * Jul 25, 2013 9:34:16 PM
     */
    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

    package cn.mr.javabeanxml;
    
    import java.util.List;
    
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlElementWrapper;
    import javax.xml.bind.annotation.XmlRootElement;
    
    /**
     * 请求对象
     * @author xuejiangtao
     * Jul 25, 2013 9:34:26 PM
     */
    @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

    package cn.mr.javabeanxml;
    
    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;
    
    import cn.mr.javabeanxml.ReqHeader;
    import cn.mr.javabeanxml.SmsBody;
    import cn.mr.javabeanxml.SmsDeliverReq;
    
    public class Test {
        
        /**
         * XML转换为javabean
         * Jul 25, 2013 9:39:05 PM xuejiangtao添加此方法
         * @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
         * Jul 25, 2013 9:39:09 PM xuejiangtao添加此方法
         * @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("src/cn/mr/javabeanxml/test.xml"));
            return sw;
        }
    
        /**
         * Jul 24, 2013 10:12:39 PM xuejiangtao添加此方法
         * @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());
        }
    }

    一下内容来自百度百科,个人觉得非常重要。
    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。 

  • 相关阅读:
    DIV+CSS布局一行两列问题(Repeater布局)
    JavaScript为DropDownList添加新项
    Indexof的实现
    父类子类构造函数的执行顺序
    微软算法面试题(2)
    Heaven on Earth
    阿里巴巴笔试题马尔科夫(HMM)的特征
    心灵净化启示录
    职场英语:开心工作的十二条秘诀
    MySql错误代码1045的解决方案
  • 原文地址:https://www.cnblogs.com/zhaoyan001/p/6343375.html
Copyright © 2011-2022 走看看