zoukankan      html  css  js  c++  java
  • 总结学习! xml与java对象转换 --- JDK自带的JAXB(Java Architecture for XML Binding)

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

    注解介绍
            1)        @XmlType
            2)        @XmlElement
            3)        @XmlRootElement
            4)        @XmlAttribute
            5)        @XmlAccessorType
            6)        @XmlAccessorOrder (不常用)
            7)        @XmlTransient (不常用)
            8)        @XmlJavaTypeAdapter (不常用)

            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文件。

            6)        @XmlAccessorOrder
                    @XmlAccessorOrder用于对java对象生成的xml元素进行排序。它有两个属性值:
                      AccessorOrder.ALPHABETICAL:对生成的xml元素按字母书序排序
                      XmlAccessOrder.UNDEFINED:不排序

            7)        @XmlTransient
                    @XmlTransient用于标示在由java对象映射xml时,忽略此属性。即,在生成的xml文件中不出现此元素。

            8)        @XmlJavaTypeAdapter
                    @XmlJavaTypeAdapter常用在转换比较复杂的对象时,如map类型或者格式化日期等。使用此注解时,需要自己写一个adapter类继承XmlAdapter抽象类,并实现里面的方法。

                    @XmlJavaTypeAdapter(value=xxx.class),value为自己定义的adapter类

                    XmlAdapter如下:

                    public abstract class XmlAdapter<ValueType,BoundType> {
                        // Do-nothing constructor for the derived classes.
                        protected XmlAdapter() {}
                        // Convert a value type to a bound type.
                        public abstract BoundType unmarshal(ValueType v);
                        // Convert a bound type to a value type.
                        public abstract ValueType marshal(BoundType v);
                     }

    代码案例:

    @XmlRootElement(name = "opDetail") //根节点
    class OpDetail {
        @XmlElement //节点元素
        private RecordInfo recordInfo;
    
        public void setRecordInfo(RecordInfo recordInfo) {
            this.recordInfo = recordInfo;
        }
    
        @Override
        public String toString() {
            return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
        }
    
    }
    
    class RecordInfo {
        @XmlElement
        private List<FieldInfo> fieldInfo;
        @XmlAttribute //节点属性
        private String isNew;
    
        public void setIsNew(String isNew) {
            this.isNew = isNew;
        }
    
        public void setFieldInfo(List<FieldInfo> fieldInfo) {
            this.fieldInfo = fieldInfo;
        }
    
        @Override
        public String toString() {
            return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
        }
    }
    
    class FieldInfo {
        private String fieldChName;
        private String fieldEnName;
        private String fieldContent;
    
        public String getFieldChName() {
            return fieldChName;
        }
    
        public void setFieldChName(String fieldChName) {
            this.fieldChName = fieldChName;
        }
    
        public String getFieldEnName() {
            return fieldEnName;
        }
    
        public void setFieldEnName(String fieldEnName) {
            this.fieldEnName = fieldEnName;
        }
    
        public String getFieldContent() {
            return fieldContent;
        }
    
        public void setFieldContent(String fieldContent) {
            this.fieldContent = fieldContent;
        }
    
        @Override
        public String toString() {
            return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
        }
    }

    main方法测试:

    public static void main(String[] args) throws Exception {
    
            OpDetail opDetail = new OpDetail();
            RecordInfo recordInfo = new RecordInfo();
            recordInfo.setIsNew("new");
    
            List<FieldInfo> fieldInfo = new ArrayList<>();
    
            FieldInfo f1 = new FieldInfo();
            f1.setFieldChName("地区1");
            f1.setFieldEnName("area1");
            f1.setFieldContent("中国");
    
            FieldInfo f2 = new FieldInfo();
            f2.setFieldChName("地区2");
            f2.setFieldEnName("area2");
            f2.setFieldContent("马来西亚");
    
            fieldInfo.add(f1);
            fieldInfo.add(f2);
    
            recordInfo.setFieldInfo(fieldInfo);
            opDetail.setRecordInfo(recordInfo);
            // 创建输出流  
            StringWriter sw = new StringWriter();
            try {
                // 利用jdk中自带的转换类实现  
                JAXBContext context = JAXBContext.newInstance(OpDetail.class);
                Marshaller marshaller = context.createMarshaller();
                //设置编码
                marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK");
                //是否要带 <?xml version="1.0" encoding="GBK" standalone="yes"?>
                marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.FALSE);
                // 格式化xml输出的格式  
                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
                // 将对象转换成输出流形式的xml  
                marshaller.marshal(opDetail, sw);
            } catch (JAXBException e) {
                e.printStackTrace();
            }
            System.out.println(sw.toString());
    /*输出如下:

    <?xml version="1.0" encoding="GBK" standalone="yes"?>
    <opDetail>
    <recordInfo isNew="new">
    <fieldInfo>
    <fieldChName>地区1</fieldChName>
    <fieldContent>中国</fieldContent>
    <fieldEnName>area1</fieldEnName>
    </fieldInfo>
    <fieldInfo>
    <fieldChName>地区2</fieldChName>
    <fieldContent>马来西亚</fieldContent>
    <fieldEnName>area2</fieldEnName>
    </fieldInfo>
    </recordInfo>
    </opDetail>

    */

    /*将xml字符串 转换成 java对象 */
            //        String xml = "<?xml version="1.0" encoding="GBK" standalone="yes"?><opDetail><recordInfo><fieldInfo><fieldChName>地区1</fieldChName><fieldContent>中国</fieldContent><fieldEnName>area1</fieldEnName></fieldInfo><fieldInfo><fieldChName>地区2</fieldChName><fieldContent>马来西亚</fieldContent><fieldEnName>area2</fieldEnName></fieldInfo></recordInfo></opDetail>";
            //        JAXBContext jc = JAXBContext.newInstance(OpDetail.class);
            //        Unmarshaller u = jc.createUnmarshaller();
            //        OpDetail o = (OpDetail)u.unmarshal(new StreamSource(new StringReader(xml)));
            //        System.out.println(o.toString());
    /*输出如下:

    com.cmcc.open.ss.model.OpDetail@1b74318a[
    recordInfo=com.cmcc.open.ss.model.RecordInfo@6960691a[
    fieldInfo=[com.cmcc.open.ss.model.FieldInfo@38946002[
    fieldChName=地区1
    fieldEnName=area1
    fieldContent=中国
    ], com.cmcc.open.ss.model.FieldInfo@152b4053[
    fieldChName=地区2
    fieldEnName=area2
    fieldContent=马来西亚
    ]]
    isNew=<null>
    ]
    */

        }
  • 相关阅读:
    算法分析之最大子段求和(一)
    算法分析之动态规划
    算法分析之数字三角形逆推
    算法分析之递归与分治策略
    算法分析之汉诺塔问题
    算法分析之猴子吃桃
    基于python玩转人工智能最火框架之TensorFlow人工智能&深度学习介绍
    win10 64下anaconda4.2.0(python3.5)
    PYTHON 爬虫 baidu美女图片
    falkonry
  • 原文地址:https://www.cnblogs.com/wuyun-blog/p/7799551.html
Copyright © 2011-2022 走看看