zoukankan      html  css  js  c++  java
  • Java&Xml教程(十一)JAXB实现XML与Java对象转换

    JAXB是Java Architecture for XML Binding的缩写,用于在Java类与XML之间建立映射,可以帮助开发人员非常方便的將XML和Java对象进行相互转换。
    本文以一个简单的样例介绍JAXB的使用。首先我们须要了解一下JAXB经常使用的API。

    • JAXBContext类。是应用的入口。用于管理XML/Java绑定信息。
    • Marshaller接口。将Java对象序列化为XML数据。
    • Unmarshaller接口,将XML数据反序列化为Java对象。

    • @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 Bean内容例如以下:
    Employee.java

    package net.csdn.beans;
    
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.XmlType;
    
    @XmlAccessorType(XmlAccessType.FIELD)  
    @XmlRootElement  
    @XmlType(name = "Employee", propOrder = { "name", "age", "role", "gender" }) 
    public class Employee {
        private String name;
        private String gender;
        private int age;
        private String role;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getGender() {
            return gender;
        }
    
        public void setGender(String gender) {
            this.gender = gender;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getRole() {
            return role;
        }
    
        public void setRole(String role) {
            this.role = role;
        }
    
        @Override
        public String toString() {
            return "Employee:: Name=" + this.name + " Age=" + this.age + " Gender="
                    + this.gender + " Role=" + this.role;
        }
    
    }

    须要转换为Java对象的XML文件内容例如以下:
    employee.xml

    <?

    xml version="1.0"?> <employee id="1"> <name>Pankaj</name> <age>29</age> <role>Java Developer</role> <gender>Male</gender> </employee>

    接下来编写測试用例代码:
    TestJAXB.java

    package net.csdn.test;
    
    import java.io.InputStream;
    import java.io.StringReader;
    import java.io.StringWriter;
    
    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.Marshaller;
    import javax.xml.bind.Unmarshaller;
    
    import net.csdn.beans.Employee;
    
    import org.junit.Test;
    
    public class TestJAXB {
        @Test
        public void testXml2Obj() throws Exception {
            InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("employee.xml");
            byte[] bytes = new byte[is.available()];
            is.read(bytes);
            String xmlStr = new String(bytes);
            JAXBContext context = JAXBContext.newInstance(Employee.class);  
            Unmarshaller unmarshaller = context.createUnmarshaller();  
            Employee emp = (Employee) unmarshaller.unmarshal(new StringReader(xmlStr));
            System.out.println(emp);
        }
    
        @Test
        public void testObj2Xml() {
            Employee  emp = new Employee();
            emp.setAge(10);
            emp.setGender("Male");
            emp.setName("Jane");
            emp.setRole("Teacher");
            String xmlStr = TestJAXB.convertToXml(emp,"utf-8");  
            System.out.println(xmlStr);
        }
    
        public static String convertToXml(Object obj, String encoding) {  
            String result = null;  
            try {  
                JAXBContext context = JAXBContext.newInstance(obj.getClass());  
                Marshaller marshaller = context.createMarshaller();  
                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);  
                marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);  
    
                StringWriter writer = new StringWriter();  
                marshaller.marshal(obj, writer);  
                result = writer.toString();  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
    
            return result;  
        } 
    
    }
    

    执行testObj2Xml測试方法。控制台输出:

    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <employee>
        <name>Jane</name>
        <age>10</age>
        <role>Teacher</role>
        <gender>Male</gender>
    </employee>
    

    执行testXml2Obj測试方法。控制台输出:

    Employee:: Name=Pankaj Age=29 Gender=Male Role=Java Developer

    注:本例中使用JUnit4作为单元測试工具,在Eclipse中点击Window->Show View->OutLine菜单打开outline视图,分别在testXml2Obj和testObj2Xml方法上点击右键->Run As->JUnit Test就可以。

  • 相关阅读:
    openssl自签发证书
    安装tomcat8 env
    路由信息相关 route 网卡
    安装jdk env
    sublime使用与配置
    docker仓库登录 配置insecure-registries
    harobor私有docker镜像仓库
    git版本回退的两种方式
    git diff命令的使用
    Kali Linux中的自带字典&crunch自建字典
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7074322.html
Copyright © 2011-2022 走看看