利用JAXB对java对象和xml互转

版权声明:本文为junehappylove原创文章,未经junehappylove允许不得转载。 https://blog.csdn.net/junehappylove/article/details/79692824

好一段时间没写博客了,一直出差得有半年多时间了吧!其实还是懒,哈哈

最近算是转行做大数据了,还好有个前辈带带,应该是比不少人少走弯路吧!
这东西主要学的是思想

今天写个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>

猜你喜欢

转载自blog.csdn.net/junehappylove/article/details/79692824