使用JAXB时,xml与java对象互转以及初始情况下直接由模板xml生成javabean

来源:互联网 发布:淘宝店铺怎么设置秒杀 编辑:程序博客网 时间:2024/05/03 07:35

在日常开发中有时会使用到xml来实现服务器间的数据交互,但是拼凑xml有时会耗费大量的时间甚至会出很多错误,作为java开发者我们如果能用直接操作java对象来处理当时是最好的,只需要在整理好数据对像后调用统一的访问方法即可,这时候我们可以使用JAXB


要使用JAXB,需要一个与xml模板对应的javabean,比如

xml模板:

<?xml version="1.0" encoding="UTF-8"?><testList><test><name></name><age></age></test></testList>

对应javabean文件:

//// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.4-2 // See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> // Any modifications to this file will be lost upon recompilation of the source schema. // Generated on: 2017.09.26 at 04:39:37 PM CST //package com.test;import java.util.ArrayList;import java.util.List;import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlRootElement;import javax.xml.bind.annotation.XmlType;/** * <p>Java class for anonymous complex type. *  * <p>The following schema fragment specifies the expected content contained within this class. *  * <pre> * <complexType> *   <complexContent> *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> *       <choice maxOccurs="unbounded" minOccurs="0"> *         <element name="test"> *           <complexType> *             <complexContent> *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> *                 <sequence> *                   <element name="name" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> *                   <element name="age" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> *                 </sequence> *               </restriction> *             </complexContent> *           </complexType> *         </element> *       </choice> *     </restriction> *   </complexContent> * </complexType> * </pre> *  *  */@XmlAccessorType(XmlAccessType.FIELD)@XmlType(name = "", propOrder = {    "test"})@XmlRootElement(name = "testList")public class TestBean {    protected List<TestBean.Test> test;    /**     * Gets the value of the test property.     *      * <p>     * This accessor method returns a reference to the live list,     * not a snapshot. Therefore any modification you make to the     * returned list will be present inside the JAXB object.     * This is why there is not a <CODE>set</CODE> method for the test property.     *      * <p>     * For example, to add a new item, do as follows:     * <pre>     *    getTest().add(newItem);     * </pre>     *      *      * <p>     * Objects of the following type(s) are allowed in the list     * {@link TestBean.Test }     *      *      */    public List<TestBean.Test> getTest() {        if (test == null) {            test = new ArrayList<TestBean.Test>();        }        return this.test;    }    /**     * <p>Java class for anonymous complex type.     *      * <p>The following schema fragment specifies the expected content contained within this class.     *      * <pre>     * <complexType>     *   <complexContent>     *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">     *       <sequence>     *         <element name="name" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>     *         <element name="age" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>     *       </sequence>     *     </restriction>     *   </complexContent>     * </complexType>     * </pre>     *      *      */    @XmlAccessorType(XmlAccessType.FIELD)    @XmlType(name = "", propOrder = {        "name",        "age"    })    public static class Test {        protected String name;        protected String age;        /**         * Gets the value of the name property.         *          * @return         *     possible object is         *     {@link String }         *              */        public String getName() {            return name;        }        /**         * Sets the value of the name property.         *          * @param value         *     allowed object is         *     {@link String }         *              */        public void setName(String value) {            this.name = value;        }        /**         * Gets the value of the age property.         *          * @return         *     possible object is         *     {@link String }         *              */        public String getAge() {            return age;        }        /**         * Sets the value of the age property.         *          * @param value         *     allowed object is         *     {@link String }         *              */        public void setAge(String value) {            this.age = value;        }    }}



java对象转xml


此模板中假设testlist是个团队,我们要把每个人test的信息存入,信息是姓名name和年龄age,可以先用java对象进行以下操作:

TestBean test = new TestBean();        List<TestBean.Test> testDataList = test.getTest();        TestBean.Test testData = new TestBean.Test();        testData.setName("aa");        testData.setAge("11");        testDataList.add(testData);

这就将一个名叫aa年龄11的人的信息加入了,接着我们写一个公共转换方法:

    public static String JObjToXml(Object obj, String encoding)    {        String result = null;        try        {            JAXBContext context = JAXBContext.newInstance(obj.getClass());            Marshaller marshaller = context.createMarshaller();            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);            marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);            StringWriter writer = new StringWriter();            marshaller.marshal(obj, writer);            result = writer.toString();        }        catch (Exception e)        {            e.printStackTrace();        }        return result;    }

然后只要调用即可:

System.out.println(JObjToXml(test, "UTF-8"));
输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<testList>
    <test>
        <name>aa</name>
        <age>11</age>
    </test>
</testList>




xml转Java对象

模板依然同上,只需下面这个方法:

@SuppressWarnings("unchecked")    public static <T> T xmlToJavaObj(String xml, Class<T> c)    {        T t = null;        try        {            JAXBContext context = JAXBContext.newInstance(c);            Unmarshaller unmarshaller = context.createUnmarshaller();            t = (T)unmarshaller.unmarshal(new StringReader(xml));        }        catch (Exception e)        {            e.printStackTrace();        }        return t;    }

调用时传入xml字符串及要转换的javaclass即可,注意模板要对应

String xmlStr = "<?xml version=\"1.0\" encoding=\"utf8w2\" standalone=\"yes\"?><testList><test><name>aa</name><age>11</age></test></testList>";TestBean convertTestBean = xmlToJavaObj(xmlStr, TestBean.class);System.out.println(convertTestBean.getTest().get(0).getName());System.out.println(convertTestBean.getTest().get(0).getAge());

输出结果:

aa
11


如何得到xml模板对应的javabean文件

方法1:手动写入,这个在这里不作太多说明,写javabean的时候需要注意属性名及注释不要有错

方法2:使用xsd及xjc根据xml模板转换:

1.准备工作:你需要有xsd.exe这个程序,一般是在Microsoft SDKs\Windows\v7.1\Bin这个路径下,前提是你已经安装了Microsoft SDK,如果没有就去官网下载安装一个(地址:https://www.microsoft.com/en-us/download/details.aspx?id=8279     我是win7所以装的7.1,可自行选择);其次你需要有JDK(基本都有否则怎么用JAXB),xjc.exe的路径在jdk1.7.0_79\bin下;最后你需要一个已经整理好的xml模板(后面就使用文章中的这个模板)


2.打开cmd,进入到xsd所在目录,运行xsd D:\xsdTest\test.xml /out:D:\xsdTest ,至于具体参数怎么用敲个xsd /?自己看吧,之后在目标目录生成一个名叫test.xsd的文件


3.输入命令 xjc D:\xsdTest\test.xsd  -d D:\xsdTest\ -p com.test,之后在目标目录生成一个目录,目录结构为/com/test会为你创建好,在test目录下会生成一个名叫TestList.java的文件和一个ObjectFactory.java文件,这个TestList文件就是我们xml模板所对应的javabean,内容和文章一开始的javabean一模一样





阅读全文
0 0
原创粉丝点击