旗下导航:搜·么
当前位置:网站首页 > XML教程 > 正文

Java&Xml教程(十一)JAXB完成XML与Java对象转换【XML教程】,Java,XML,JAXB

作者:搜教程发布时间:2019-11-27分类:XML教程浏览:34评论:0


导读:JAXB是JavaArchitectureforXMLBinding的缩写,用于在Java类与XML之间竖立映照,可以协助开发者很轻易的將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即可。

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即可。

以上就是Java&Xml教程(十一)JAXB完成XML与Java对象转换的内容,更多相关内容请关注ki4网(www.ki4.cn)!

标签:JavaXMLJAXB


欢迎 发表评论: