>백엔드 개발 >XML/RSS 튜토리얼 >Java&Xml Tutorial (11) JAXB는 XML 및 Java 객체 변환을 구현합니다.

Java&Xml Tutorial (11) JAXB는 XML 및 Java 객체 변환을 구현합니다.

黄舟
黄舟원래의
2017-02-22 15:05:511915검색


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 클래스의 모든 비정적(정적), 비일시적(@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;
    }

}

변환해야 하는 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 메뉴를 사용하여 각각 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 클래스의 모든 비정적(정적), 비일시적(@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;
    }

}

변환해야 하는 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 메뉴를 사용하여 각각 testXml2Obj 및 testObj2Xml 메소드에서 개요 보기를 엽니다. 마우스 오른쪽 버튼 클릭->Run As->JUnit Test.

위는 Java&Xml 튜토리얼입니다. (11) XML 및 Java 객체 변환의 JAXB 구현에 대한 자세한 내용은 PHP 중국어 웹사이트(www.php.cn)를 참고하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.