Heim >Backend-Entwicklung >XML/RSS-Tutorial >Detaillierte Erläuterung des Beispielcodes für Jaxb2 zur Implementierung der gegenseitigen Bean- und XML-Konvertierung

Detaillierte Erläuterung des Beispielcodes für Jaxb2 zur Implementierung der gegenseitigen Bean- und XML-Konvertierung

黄舟
黄舟Original
2017-03-31 14:40:072129Durchsuche

1. Beschreibung wichtiger Klassen

Die JAXBContext-Klasse ist der Einstiegspunkt der Anwendung und wird zum Verwalten von XML/Java-Bindungsinformationen verwendet.

MarshallerSchnittstelle, konvertiert Java-Paare in XML-Daten.

Unmarshaller-Schnittstelle, konvertiert XML in JavaObjekt.

@XmlType, ordnet Java-Klassen oder Aufzählungstypen XML-Schematypen zu

@XmlAccessorType(XmlAccessType.FIELD), steuert die Serialisierung von Feldern oder Attributen. FIELD bedeutet, dass JAXB automatisch jedes nicht-statische (statische),

nicht-transiente (markiert durch @XmlTransient) Feld in der Java-Klasse an XML bindet. Andere Werte sind XmlAccessType.PROPERTY und XmlAccessType.NONE.

@XmlAccessorOrder, steuert die Reihenfolge von Eigenschaften und Feldern in JAXB-Bindungsklassen.

@XmlJavaTypeAdapter, verwendet einen benutzerdefinierten Adapter (d. h. erweitert die abstrakte Klasse XmlAdapter und überschreibt die Methoden „marshal()“ und „unmarshal()“), um Java-Klassen in XML zu serialisieren.

@XmlElementWrapper generiert für ein Array oder eine Sammlung (d. h. eine Mitglieds-Variable, die mehrere Elemente enthält) ein XML-Element, das das Array oder die Sammlung umschließt (genannt a Verpackungsgerät).

@XmlRootElement, ordnet Java-Klassen oder Aufzählungstypen XML-Elementen zu.

@XmlElement, ordnet ein Attribut einer Java-Klasse einem XML-Element mit demselben Namen wie das Attribut zu.

@XmlAttribute, ordnet ein Attribut einer Java-Klasse einem XML-Attribut mit demselben Namen wie das Attribut zu.

2. Beispiele

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;
	}
}
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;
	}
}

2. Konvertierungstool-Klasse

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;
	}
}

3. Testklasse

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=&#39;1.0&#39; encoding=&#39;utf-8&#39; ?>" 
				+ "<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. Testergebnisse

4.1. TestBeanToXml-Methode ausführen

<?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>

4.2. TestXmlToBean-Methode ausführen

1--2016-03-10 09:36:01--中国
广东省---广州市
湖南省---长沙市

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Beispielcodes für Jaxb2 zur Implementierung der gegenseitigen Bean- und XML-Konvertierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn