上海網(wǎng)站建設(shè)培訓(xùn)班/網(wǎng)站推廣培訓(xùn)
目錄
- XML和Bean轉(zhuǎn)換工具簡介
- JAXB簡介
- Java Bean類
- XMLUtil工具類
另一篇轉(zhuǎn)換方式
xstream實(shí)現(xiàn)xml和java bean 互相轉(zhuǎn)換
XML和Bean轉(zhuǎn)換工具簡介
Java中實(shí)現(xiàn)XML和Bean的轉(zhuǎn)換的方式或插件有以下幾種:
JAXB(Java Architecture for XML Binding):JAXB是Java SE的一部分,可以將Java對(duì)象與XML文檔相互轉(zhuǎn)換。它提供了注解和XML綁定文件兩種配置方式。
Dom4j:Dom4j是一個(gè)開源的Java庫,用于操作XML文檔。它可以將XML文檔轉(zhuǎn)換為Java對(duì)象,也可以將Java對(duì)象轉(zhuǎn)換為XML文檔。
XStream:XStream是一個(gè)簡單易用的Java庫,用于序列化和反序列化對(duì)象。它可以將Java對(duì)象轉(zhuǎn)換為XML文檔,也可以將XML文檔轉(zhuǎn)換為Java對(duì)象。
SimpleXML:SimpleXML是一個(gè)輕量級(jí)的Java庫,用于處理XML文檔。它可以將XML文檔轉(zhuǎn)換為Java對(duì)象,也可以將Java對(duì)象轉(zhuǎn)換為XML文檔。
Jackson:Jackson是一個(gè)流行的Java庫,用于處理JSON數(shù)據(jù)。它也支持將Java對(duì)象轉(zhuǎn)換為XML文檔,以及將XML文檔轉(zhuǎn)換為Java對(duì)象。
JiBX:JiBX是一個(gè)強(qiáng)大的Java庫,用于處理XML文檔。它可以將Java對(duì)象與XML文檔相互轉(zhuǎn)換,支持多種映射策略。
Castor:Castor是一個(gè)高性能的Java庫,用于處理XML文檔。它可以將Java對(duì)象與XML文檔相互轉(zhuǎn)換,支持多種映射策略。
Apache CXF:Apache CXF是一個(gè)開源的Web服務(wù)框架,提供了許多用于處理XML和SOAP消息的功能。它支持將Java對(duì)象與XML文檔相互轉(zhuǎn)換。
JAXB簡介
這里介紹一下 JAXB,JAXB(Java Architecture for XML Binding)是Java SE的一部分,不需要依賴其他包,可以將Java對(duì)象與XML文檔相互轉(zhuǎn)換。
下面是主要介紹常用的注解的基本含義和區(qū)別:
- @XmlAccessorType: 這個(gè)注解用來指定類或?qū)傩?#xff08;字段)的訪問類型。它有四個(gè)可能的值:FIELD, TYPE, PROPERTY, ALL。默認(rèn)情況下,JAXB使用FIELD模式,這意味著JAXB將嘗試訪問類中的所有字段。如果這個(gè)注解不存在,那么JAXB將使用默認(rèn)值。
- @XmlRootElement: 這個(gè)注解標(biāo)記一個(gè)類作為XML根元素。JAXB將生成一個(gè)XML文檔,該文檔包含根元素以及由類字段/屬性定義的任何其他元素。
- @XmlElement(name = “Label”): 這個(gè)注解表示一個(gè)類屬性或字段被映射到一個(gè)XML元素,并且這個(gè)元素的標(biāo)簽名稱為"Label"。
- @XmlAttribute: 這個(gè)注解表示一個(gè)類屬性或字段被映射到一個(gè)XML屬性。屬性是在XML元素中定義的,并且通常用于表示元素的簡單類型值。
- @XmlType(propOrder = {“value”, “category”, “background”}): 這個(gè)注解定義了當(dāng)一個(gè)類被映射到XML時(shí),元素和屬性的順序。在這個(gè)例子中,"value"是首先出現(xiàn)的元素,"category"和"background"是接下來的元素。如果你在propOrder中沒有指定元素名稱,那么它們將按照它們?cè)陬愔谐霈F(xiàn)的順序進(jìn)行映射。
使用這些注解的方式通常是在你的Java類中添加它們。例如下邊的Java Bean類。
Java Bean類
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;import lombok.Getter;
import lombok.Setter;import java.io.Serializable;@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "View")
@XmlType(propOrder = {})
@Getter
@Setter
public class View implements Serializable {private static final long serialVersionUID = 4678366086955878610L;@XmlElement(name = "Image")private Image image;@XmlElement(name = "Table")private Table table;@XmlElement(name = "Text")private Text text;@XmlElement(name = "Choices")private Choices choices;@XmlElement(name = "RectangleLabels")private RectangleLabels rectangleLabels;@XmlElement(name = "Labels")private Labels labels;@XmlElement(name = "Rectangle")private Rectangle rectangle;@XmlElement(name = "Polygon")private Polygon polygon;@XmlElement(name = "TextArea")private TextArea textArea;}
import java.io.Serializable;
import java.util.List;import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;import lombok.Getter;
import lombok.Setter;@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Labels")
@XmlType(propOrder = {"name","toName","labelList"
})
@Setter
@Getter
public class Labels implements Serializable {private static final long serialVersionUID = 4017289488745470829L;@XmlAttributeprivate String name;@XmlAttributeprivate String toName;@XmlElement(name = "Label")private List<Label> labelList;
}
import java.io.Serializable;import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;import lombok.Getter;
import lombok.Setter;@XmlAccessorType(XmlAccessType.FIELD)
// XML文件中的根標(biāo)識(shí)
@XmlRootElement(name = "Label")
// 控制JAXB 綁定類中屬性和字段的排序
@XmlType(propOrder = {"value","category","background"
})
@Getter
@Setter
public class Label implements Serializable {private static final long serialVersionUID = 5135918993113626857L;@XmlAttributeprivate String value;@XmlAttributeprivate String category;@XmlAttributeprivate String background;
}
XMLUtil工具類
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;import lombok.extern.slf4j.Slf4j;@Slf4j
public class XMLUtil {private XMLUtil(){}public static Object convertXMLToObject(Class<?> clazz, String xml) {Object xmlObject = null;try {JAXBContext context = JAXBContext.newInstance(clazz);// 進(jìn)行將Xml轉(zhuǎn)成對(duì)象的核心接口Unmarshaller unmarshaller = context.createUnmarshaller();StringReader sr = new StringReader(xml);xmlObject = unmarshaller.unmarshal(sr);} catch (Exception ex) {log.error("XML轉(zhuǎn)換對(duì)象失敗", ex);}return xmlObject;}public static String convertToXml(Object obj) {// 創(chuàng)建輸出流StringWriter sw = new StringWriter();try {// 利用jdk中自帶的轉(zhuǎn)換類實(shí)現(xiàn)JAXBContext context = JAXBContext.newInstance(obj.getClass());Marshaller marshaller = context.createMarshaller();// 格式化xml輸出的格式 true 帶格式化 false 不帶格式化marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// true 忽略xml頭信息marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);// 將對(duì)象轉(zhuǎn)換成輸出流形式的xmlmarshaller.marshal(obj, sw);} catch (JAXBException e) {log.error("對(duì)象轉(zhuǎn)XML失敗", e);}return sw.toString();}}