1. 중요 클래스 설명
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 속성에 매핑합니다.
2. 예제
1. JavaBean
import java.util.Date; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import com.tzz.util.xml.JaxbDateSerializer; @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "country") @XmlType(propOrder = { "id", "createDate", "name", "provinceList" }) public class Country { private Integer id; @XmlJavaTypeAdapter(JaxbDateSerializer.class) private Date createDate; @XmlElement(name = "name") private String name; @XmlElementWrapper(name = "provinces") @XmlElement(name = "province") private List<Province> provinceList; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Date getCreateDate() { return createDate; } public void setCreateDate(Date createDate) { this.createDate = createDate; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Province> getProvinceList() { return provinceList; } public void setProvinceList(List<Province> provinceList) { this.provinceList = provinceList; } }
2. 변환 도구 클래스
import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(propOrder = { "name", "provCity" }) public class Province { @XmlElement(name = "name") private String name; @XmlElement(name = "provCity") private String provCity; public String getProvCity() { return provCity; } public void setProvCity(String provCity) { this.provCity = provCity; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
3. 테스트 클래스
import java.io.StringReader; import java.io.StringWriter; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; /** * Jaxb 2.0 * */ public class JaxbXmlUtil { @SuppressWarnings("unchecked") public static <T> T xmlToBean(String xml, Class<T> beanClass) { try { JAXBContext jaxbContext = JAXBContext.newInstance(beanClass); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); T user = (T) unmarshaller.unmarshal(new StringReader(xml)); return user; } catch (JAXBException e) { e.printStackTrace(); return null; } } /**Bean转XML*/ public static String beanToXml(Object obj) { String result = null; try { JAXBContext context = JAXBContext.newInstance(obj.getClass()); Marshaller marshaller = context.createMarshaller(); //决定是否在转换成xml时同时进行格式化(即按标签自动换行,否则即是一行的xml) marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); //Marshaller.JAXB_ENCODING xml的编码方式 marshaller.setProperty(Marshaller.JAXB_ENCODING, "utf-8"); StringWriter writer = new StringWriter(); marshaller.marshal(obj, writer); result = writer.toString(); } catch (Exception e) { e.printStackTrace(); } return result; } }
4. 테스트 결과
4.1. testBeanToXml 메소드 실행
import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.junit.Test; import com.tzz.test.util.xml.entity.Country; import com.tzz.test.util.xml.entity.Province; import com.tzz.util.xml.JaxbXmlUtil; public class TestJaxbBeanToXmlUtil { @Test public void testBeanToXml() { Country country = new Country(); country.setId(1); country.setCreateDate(new Date()); country.setName("中国"); List<Province> list = new ArrayList<Province>(); Province province = new Province(); province.setName("广东省"); province.setProvCity("广州市"); Province province2 = new Province(); province2.setName("湖南省"); province2.setProvCity("长沙市"); list.add(province); list.add(province2); country.setProvinceList(list); String xml = JaxbXmlUtil.beanToXml(country); System.out.println(xml); } @Test public void testXmlToBean() { String xml = "<?xml version='1.0' encoding='utf-8' ?>" + "<country>" + "<id>1</id>" + "<createDate>2016-03-10 09:36:01</createDate>" + "<name>中国</name>" + "<provinces>" + "<province><name>广东省</name><provCity>广州市</provCity></province>" + "<province><name>湖南省</name><provCity>长沙市</provCity></province>" + "</provinces>" + "</country>"; Country country = JaxbXmlUtil.xmlToBean(xml, Country.class); System.out.println(country.getId() + "--" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") .format(country.getCreateDate()) + "--" + country.getName()); for (Province p : country.getProvinceList()) { System.out.println(p.getName() + "---" + p.getProvCity()); } } }
4.2 testXmlToBean 메소드 실행
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <country> <id>1</id> <createDate>2016-03-10 05:24:57</createDate> <name>中国</name> <provinces> <province> <name>广东省</name> <provCity>广州市</provCity> </province> <province> <name>湖南省</name> <provCity>长沙市</provCity> </province> </provinces> </country>
위 내용은 Bean과 XML 상호 변환을 구현하기 위한 Jaxb2의 샘플 코드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!