Home  >  Article  >  Backend Development  >  Java&Xml Tutorial (11) JAXB implements XML and Java object conversion

Java&Xml Tutorial (11) JAXB implements XML and Java object conversion

黄舟
黄舟Original
2017-02-22 15:05:511806browse


JAXB is the abbreviation of Java Architecture for XML Binding, which is used to establish mapping between Java classes and XML, and can help developers easily convert XML and Java objects to each other.
This article uses a simple example to introduce the use of JAXB. First, we need to understand the commonly used APIs of JAXB.

  • The JAXBContext class is the entry point of the application and is used to manage XML/Java binding information.

  • Marshaller interface, serializes Java objects into XML data.

  • Unmarshaller interface, deserializes XML data into Java objects.

  • @XmlType, maps Java classes or enumeration types to XML schema types

  • @XmlAccessorType(XmlAccessType.FIELD), control fields or Serialization of properties. FIELD means that JAXB will automatically bind every non-static (static), non-transient (marked by @XmlTransient) field in the Java class to XML. Other values ​​are XmlAccessType.PROPERTY and XmlAccessType.NONE.

  • @XmlAccessorOrder, controls the ordering of properties and fields in the JAXB binding class

  • @XmlJavaTypeAdapter, uses a customized adapter (that is, extends the abstract class XmlAdapter and override the marshal() and unmarshal() methods) to serialize Java classes to XML.

  • @XmlElementWrapper, for an array or collection (that is, a member variable containing multiple elements), generates an XML element (called a wrapper) that wraps the array or collection.

  • @XmlRootElement, maps Java classes or enumeration types to XML elements.

  • @XmlElement, maps an attribute of a Java class to an XML element with the same name as the attribute.

  • @XmlAttribute maps an attribute of a Java class to an XML attribute with the same name as the attribute.

The content of the Java Bean we need to bind is as follows:
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;
    }

}

The content of the XML file that needs to be converted into a Java object is as follows:
employee.xml

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

Next write the test case code:
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;  
    } 

}

Run the testObj2Xml test method, console output:

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

Run the testXml2Obj test method , console output:

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

Note: In this example, JUnit4 is used as the unit testing tool. In Eclipse, click the Window->Show View->OutLine menu to open the outline view, respectively on the testXml2Obj and testObj2Xml methods. Right click->Run As->JUnit Test.

JAXB is the abbreviation of Java Architecture for XML Binding, which is used to establish mapping between Java classes and XML, and can help developers easily convert XML and Java objects to each other.
This article uses a simple example to introduce the use of JAXB. First, we need to understand the commonly used APIs of JAXB.

  • The JAXBContext class is the entry point of the application and is used to manage XML/Java binding information.

  • Marshaller interface, serializes Java objects into XML data.

  • Unmarshaller interface, deserializes XML data into Java objects.

  • @XmlType, maps Java classes or enumeration types to XML schema types

  • @XmlAccessorType(XmlAccessType.FIELD), control fields or Serialization of properties. FIELD means that JAXB will automatically bind every non-static (static), non-transient (marked by @XmlTransient) field in the Java class to XML. Other values ​​are XmlAccessType.PROPERTY and XmlAccessType.NONE.

  • @XmlAccessorOrder, controls the ordering of properties and fields in the JAXB binding class

  • @XmlJavaTypeAdapter, uses a customized adapter (that is, extends the abstract class XmlAdapter and override the marshal() and unmarshal() methods) to serialize Java classes to XML.

  • @XmlElementWrapper, for an array or collection (that is, a member variable containing multiple elements), generates an XML element (called a wrapper) that wraps the array or collection.

  • @XmlRootElement, maps Java classes or enumeration types to XML elements.

  • @XmlElement, maps an attribute of a Java class to an XML element with the same name as the attribute.

  • @XmlAttribute maps an attribute of a Java class to an XML attribute with the same name as the attribute.

The content of the Java Bean we need to bind is as follows:
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;
    }

}

The content of the XML file that needs to be converted into a Java object is as follows:
employee.xml

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

Next write the test case code:
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;  
    } 

}

Run the testObj2Xml test method, console output:

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

Run the testXml2Obj test method , console output:

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

Note: In this example, JUnit4 is used as the unit testing tool. In Eclipse, click the Window->Show View->OutLine menu to open the outline view, respectively on the testXml2Obj and testObj2Xml methods. Right click->Run As->JUnit Test.

The above is the Java&Xml tutorial (11) JAXB implementation of XML and Java object conversion. For more related content, please pay attention to the PHP Chinese website (www.php.cn)!


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn