利用JAXB對java物件和xml互轉
好一段時間沒寫部落格了,一直出差得有半年多時間了吧!其實還是懶,哈哈
最近算是轉行做大資料了,還好有個前輩帶帶,應該是比不少人少走彎路吧!
這東西主要學的是思想
今天寫個java物件和xml互轉的(專案的要用到xml的配置檔案)
主要是用JAXB實現java物件與xml直接的互相轉換,先列舉一下JAXB(Java Architecture for XML Binding)的註解
JAXB(Java Architecture for XML Binding) 是一個業界的標準,是一項可以根據XML Schema產生Java類的技術。
@XmlRootElement
name
屬性定義這個根節點的名稱。@XmlAccessorType,定義對映這個類中的何種型別都需要對映到xml。(如果不存在@XmlAccessorType,預設使用
XmlAccessType.PUBLIC_MEMBER
註解)引數:
XmlAccessType.FIELD
: java物件中的所有成員變數。XmlAccessType.PROPERTY
:java物件中所有通過getter/setter方式訪問的成員變數。XmlAccessType.PUBLIC_MEMBER
:java物件中所有的public訪問許可權的成員變數和通過getter/setter方式訪問的成員變數。XmlAccessType.NONE
: java物件的所有屬性都不對映為xml的元素。@XmlAttribute,用於把java物件的屬性對映為xml的屬性,並可通過
name
屬性為生成的xml屬性指定別名。@XmlElement,指定一個欄位或get/set方法對映到xml的節點。通過
name
屬性定義這個根節點的名稱。@XmlElementWrapper,為陣列或集合定義一個父節點。通過
name
屬性定義這個父節點的名稱。- @XmlTransient,用於標示在由java物件對映xml時,忽略此屬性,在生成的xml檔案中不出現此元素。
使用舉例
/**
* 讀入projectMeta.xml配置檔案到物件中
*
* @param xmlPath
* xml的檔案路徑
* @return MetaDataHelper物件
* @throws JAXBException
* 異常
*/
public MetaDataHelper loadXmlObject(String xmlPath) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(MetaDataHelper.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
MetaDataHelper object = (MetaDataHelper) unmarshaller.unmarshal(new File(xmlPath));
return object;
}
/**
* 將java物件寫成xml檔案資料
*
* @param metaData
* java物件
* @return xml字串
* @throws JAXBException
* 異常
*/
public String MeteData2Xml(MetaDataHelper metaData) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(MetaDataHelper.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
StringWriter writer = new StringWriter();
marshaller.marshal(metaData, writer);
return writer.toString();
}
其中MetaDataHelper 類中有定義根元素和其他相關元素,如下
@XmlRootElement(name = "project")
public class MetaDataHelper {
private Map<String, ItemMetaData> itemMetaDatas = null;
private ModelInfoMetaData modelMetaData = null;
private SceneMetaData sceneMetaData = null;
/**
* 指標元資料定義
*
* @return 返回全部item的元資料定義資訊
*/
@XmlElementWrapper(name = "dataDescription")
public Map<String, ItemMetaData> getItemMetaDatas() {
return itemMetaDatas;
}
public void setItemMetaDatas(Map<String, ItemMetaData> itemMetaDatas) {
this.itemMetaDatas = itemMetaDatas;
}
/**
* 獲取模型元資料定義
*
* @return 返回ModelMetaData物件
*/
@XmlElement(name = "model")
public ModelInfoMetaData getModelMetaData() {
return modelMetaData;
}
public void setModelMetaData(ModelInfoMetaData modelMetaData) {
this.modelMetaData = modelMetaData;
}
@XmlElement(name = "scene")
public SceneMetaData getSceneMetaData() {
return sceneMetaData;
}
public void setSceneMetaData(SceneMetaData sceneMetaData) {
this.sceneMetaData = sceneMetaData;
}
}
最後寫一個測試類會生成相應的xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<project>
<dataDescription>
<entry>
<key>PBR4</key>
<value frequency="0" itemKey="PBR4" isMain="false" type="numbericItemClass">
<action>ArimaClass</action>
<rowIndex>24</rowIndex>
<rowIndexNew>4</rowIndexNew>
</value>
</entry>
<entry>
<key>MR</key>
<value frequency="1" itemKey="MR" isMain="false" type="numbericItemClass">
<action>ArimaClass</action>
<cluster>KeyModeClass</cluster>
<rowIndex>22</rowIndex>
<rowIndexNew>2</rowIndexNew>
</value>
</entry>
<entry>
<key>TCPfailure</key>
<value frequency="0" itemKey="UCTA" isMain="true" type="booleanItemClass">
<action>ArimaClass</action>
<rowIndex>25</rowIndex>
<rowIndexNew>5</rowIndexNew>
</value>
</entry>
<entry>
<key>UCTA</key>
<value frequency="1" itemKey="UCTA" isMain="true" type="booleanItemClass">
<action>ArimaClass</action>
<rowIndex>23</rowIndex>
<rowIndexNew>3</rowIndexNew>
</value>
</entry>
</dataDescription>
<model author="junwei" createTime="2018-03-26T01:39:52.578+08:00" id="jwDemo-10296">
<description>this model is created, trained and used for AIdemo purpose, this description is for specification</description>
<objectModel>
<action>logisticRegression</action>
<inputsTable>
<property>stability</property>
<property>capability</property>
</inputsTable>
</objectModel>
<properties>
<entry>
<key>capability</key>
<value key="capability">
<action mainKayAsInput="true" name="CNNClass" type="forecastClass"/>
<mainItem>PBR4</mainItem>
<refItems>
<item>MR</item>
<item>PBR4</item>
</refItems>
</value>
</entry>
<entry>
<key>MR</key>
<value key="MR"/>
</entry>
<entry>
<key>stability</key>
<value key="stability">
<action mainKayAsInput="false" name="bayesClass" type="forecast"/>
<refItems>
<item>MR</item>
<item>UCTA</item>
</refItems>
</value>
</entry>
</properties>
</model>
<scene class="cellObjectClass">
<src>t_cell_info</src>
</scene>
</project>