1. 程式人生 > >利用JAXB對java物件和xml互轉

利用JAXB對java物件和xml互轉

好一段時間沒寫部落格了,一直出差得有半年多時間了吧!其實還是懶,哈哈

最近算是轉行做大資料了,還好有個前輩帶帶,應該是比不少人少走彎路吧!
這東西主要學的是思想

今天寫個java物件和xml互轉的(專案的要用到xml的配置檔案)

主要是用JAXB實現java物件與xml直接的互相轉換,先列舉一下JAXB(Java Architecture for XML Binding)的註解

JAXB(Java Architecture for XML Binding) 是一個業界的標準,是一項可以根據XML Schema產生Java類的技術。

  1. @XmlRootElement

    ,用於類級別的註解,對應xml的元素。通過name屬性定義這個根節點的名稱。

  2. @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的元素。

  3. @XmlAttribute,用於把java物件的屬性對映為xml的屬性,並可通過name屬性為生成的xml屬性指定別名。

  4. @XmlElement,指定一個欄位或get/set方法對映到xml的節點。通過name屬性定義這個根節點的名稱。

  5. @XmlElementWrapper,為陣列或集合定義一個父節點。通過name屬性定義這個父節點的名稱。

  6. @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>