JAXB的XML和Object的自动转换

JAXB可以实现XML和Object的自动转换,这样我们就不用再自己写xml的解析了。

1、从xml文件读取自动转换成Object

2、从xml字符串读取自动转换成Object

3、把对象转化成xml输出到控制台

4、把对象转化成xml输出到文件

5、把对象转化成xml字符串

vdi.xml

<?xml version="1.0" encoding="UTF-8"?>
<vdis size="2" batch_number="20141212123456" errmsg="">
    <vdi>
        <id>1</id>
        <uuid>6524552158933218</uuid>
        <name>disk1</name>
        <disk_size>20</disk_size>
    </vdi>
    <vdi>
        <id>2</id>
        <uuid>6524552158933123</uuid>
        <name>disk2</name>
        <disk_size>40</disk_size>
    </vdi>
</vdis>

Vdis.java

package com.chinac.jaxb.parsexml;

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.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "vdis")
@XmlAccessorType(XmlAccessType.FIELD)
public class Vdis extends ArrayList<Vdi>{

    @XmlAttribute(name = "size")
    private int size;
    @XmlAttribute(name = "batch_number")
    private Long batchNumber;
    @XmlAttribute(name = "errmsg")
    private String errmsg;

    @XmlElement(name = "vdi")
    private List<Vdi> getVdis(){
        return this;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public Long getBatchNumber() {
        return batchNumber;
    }

    public void setBatchNumber(Long batchNumber) {
        this.batchNumber = batchNumber;
    }

    public String getErrmsg() {
        return errmsg;
    }

    public void setErrmsg(String errmsg) {
        this.errmsg = errmsg;
    }

    @Override
    public String toString() {
        return "size:"+size
                + ",batchNumber:"+batchNumber
                + ",errmsg:"+errmsg
                + "";
    }
}

Vdi.java

package com.chinac.jaxb.parsexml;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;

@XmlAccessorType(XmlAccessType.FIELD)
public class Vdi {
    @XmlElement(name = "id")
    private int id;
    @XmlElement(name = "uuid")
    private String uuid;
    @XmlElement(name = "name")
    private String name;
    @XmlElement(name = "disk_size")
    private int diskSize;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUuid() {
        return uuid;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getDiskSize() {
        return diskSize;
    }

    public void setDiskSize(int diskSize) {
        this.diskSize = diskSize;
    }

    @Override
    public String toString() {
        return "id:"+id
                + ",uuid:"+uuid
                + ",name:"+name
                + ",diskSize:"+diskSize;
    }
}

Test.java

package com.chinac.jaxb.test;

import java.io.File;
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 javax.xml.transform.stream.StreamSource;
import com.chinac.jaxb.parsexml.Vdi;
import com.chinac.jaxb.parsexml.Vdis;

@SuppressWarnings("unchecked")
public class Test {

    //从xml文件读取
    public static <T> T readFromFile(Class<T> clazz , String filePath) throws JAXBException{
        JAXBContext jc = JAXBContext.newInstance(clazz);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        return (T) unmarshaller.unmarshal(new File(filePath));
    }

    //从xml字符串读取
    public static <T> T readFromString(Class<T> clazz , StringBuffer xmlStr) throws JAXBException{
        JAXBContext jc = JAXBContext.newInstance(clazz);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        return (T) unmarshaller.unmarshal(new StreamSource(new StringReader(xmlStr.toString())));
    }

    //把对象转化成xml输出到控制台
    public static <T> void writeToConsole(Class<T> clazz , T t) throws JAXBException{
        JAXBContext cxt = JAXBContext.newInstance(clazz);
        Marshaller marshaller = cxt.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// 编码格式
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// 是否格式化生成的xml串
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);// 默认false表示xml指令存在
        marshaller.marshal(t, System.out);
    }

    //把对象转化成xml输出到文件
    public static <T> void writeToFile(Class<T> clazz , T t , String filePath) throws JAXBException{
        JAXBContext cxt = JAXBContext.newInstance(clazz);
        Marshaller marshaller = cxt.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// 编码格式
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// 是否格式化生成的xml串
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);// 默认false表示xml指令存在
        marshaller.marshal(t, new File(filePath));
    }

    //把对象转化成xml字符串
    public static <T> String writeToString(Class<T> clazz , T t) throws JAXBException{
        JAXBContext cxt = JAXBContext.newInstance(clazz);
        Marshaller marshaller = cxt.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// 编码格式
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// 是否格式化生成的xml串
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);// 默认false表示xml指令存在

        StringWriter writer = new StringWriter();
        marshaller.marshal(t, writer);
        return writer.toString();
    }

    public static void main(String[] args) throws JAXBException {
        //从xml文件读取
        String filePath = "./src/vdi.xml";
        Vdis vdis1 = Test.readFromFile(Vdis.class, filePath);
        System.out.println(vdis1.toString());
        for(Vdi vdi : vdis1){
            System.out.println(vdi);
        }

        //从xml字符串读取
        StringBuffer xmlStr = new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
                + "<vdis size=\"2\" batch_number=\"20141212123456\" errmsg=\"\">"
                    + "<vdi>"
                        + "<id>1</id>"
                        + "<uuid>6524552158933218</uuid>"
                        + "<name>disk1</name>"
                        + "<disk_size>20</disk_size>"
                    + "</vdi>"
                    + "<vdi>"
                        + "<id>2</id>"
                        + "<uuid>6524552158933123</uuid>"
                        + "<name>disk2</name>"
                        + "<disk_size>40</disk_size>"
                        + "</vdi>"
                    + "</vdis>");
        Vdis vdis2 = Test.readFromString(Vdis.class, xmlStr);
        System.out.println(vdis2.toString());
        for(Vdi vdi : vdis2){
            System.out.println(vdi);
        }

        //把对象转化成xml输出到控制台

        Test.writeToConsole(Vdis.class, vdis2);

        //把对象转化成xml输出到文件
        String filePath2 = "./src/test.xml";
        Test.writeToFile(Vdis.class, vdis2, filePath2);

        //把对象转化成xml字符串
        String xmlStr2 = Test.writeToString(Vdis.class, vdis2);
        System.out.println(xmlStr2);
    }
}

注意:

用了@XmlAccessorType(XmlAccessType.FIELD)、@XmlElement、@XmlAttribute注解后,属性自己的getter/setter方法就会被忽略,去掉这些主键使用属性自己的getter/setter方法一样可以。

简洁版:

Vdis.java

package com.chinac.jaxb.parsexml;

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.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "vdis")
@XmlAccessorType(XmlAccessType.FIELD)
public class Vdis extends ArrayList<Vdi>{

    @XmlAttribute(name = "size")
    private int size;
    @XmlAttribute(name = "batch_number")
    private Long batchNumber;
    @XmlAttribute(name = "errmsg")
    private String errmsg;

    @XmlElement(name = "vdi")
    private List<Vdi> getVdis(){
        return this;
    }

    @Override
    public String toString() {
        return "size:"+size
                + ",batchNumber:"+batchNumber
                + ",errmsg:"+errmsg
                + "";
    }
}

Vdi.java

package com.chinac.jaxb.parsexml;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;

@XmlAccessorType(XmlAccessType.FIELD)
public class Vdi {
    @XmlElement(name = "id")
    private int id;
    @XmlElement(name = "uuid")
    private String uuid;
    @XmlElement(name = "name")
    private String name;
    @XmlElement(name = "disk_size")
    private int diskSize;

    @Override
    public String toString() {
        return "id:"+id
                + ",uuid:"+uuid
                + ",name:"+name
                + ",diskSize:"+diskSize;
    }
}

自主版:

Vdis.java

package com.chinac.jaxb.parsexml;

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.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "vdis")
@XmlAccessorType(XmlAccessType.FIELD)
public class Vdis extends ArrayList<Vdi>{

    private int size;
    private Long batchNumber;
    private String errmsg;
    private List<Vdi> getVdis(){
        return this;
    }

    public int getSize() {
       System.out.println("aaa");
        return size;
    }

    public void setSize(int size) {
       System.out.println("bbb");
        this.size = size;
    }

    public Long getBatchNumber() {
        return batchNumber;
    }

    public void setBatchNumber(Long batchNumber) {
        this.batchNumber = batchNumber;
    }

    public String getErrmsg() {
        return errmsg;
    }

    public void setErrmsg(String errmsg) {
        this.errmsg = errmsg;
    }

    @Override
    public String toString() {
        return "size:"+size
                + ",batchNumber:"+batchNumber
                + ",errmsg:"+errmsg
                + "";
    }
}

Vdi.java

package com.chinac.jaxb.parsexml;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;

public class Vdi {
    private int id;
    private String uuid;
    private String name;
    private int diskSize;

    public int getId() {
       System.out.println("ccc");
        return id;
    }

    public void setId(int id) {
        System.out.println("ddd");
       this.id = id;
    }

    public String getUuid() {
        return uuid;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getDiskSize() {
        return diskSize;
    }

    public void setDiskSize(int diskSize) {
        this.diskSize = diskSize;
    }

    @Override
    public String toString() {
        return "id:"+id
                + ",uuid:"+uuid
                + ",name:"+name
                + ",diskSize:"+diskSize;
    }
}
时间: 2024-08-11 01:35:16

JAXB的XML和Object的自动转换的相关文章

JAXB 操作XML 与 Object

Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.是一种xml与object映射绑定技术标准. JDK5以下开发需要的jar包:activation.jar.jaxb-api.jar. jaxb-impl.jar. jsr173-api.jar JDK6以上版本已经集成JAXB2的JAR,在目录{JDK_HOME}/jre/lib/rt.jar中.  @XmlAccessorType 注解 的枚举常量值

JAXB 实现 XML &amp; JAVABEAN 的转换

一 前言 集成接口项目的开发,与第三方系统或中间平台等进行交互,支持服务端&客户端,支持 http/ https/ Webservice 等多种交互方式,数据传输主要采用XML(部分可能会在XML中以<![CDATA[......]]> 的形式包裹 JSON字符串),以后也可能会采用 JSON 格式.鉴于功能需要,必然要将XML传输的数据转换为JAVA对象来进行数据的处理,以及将JAVA对象转换为XML作为报文进行传输,因此,给出以下方案:利用JAXB技术来实现JAVA对象与XML的自

SpringMVC关于json、xml自动转换的原理研究

前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC-introduction.html 现象 本文使用的demo基于maven,是根据入门blog的例子继续写下去的. 我们先来看一看对应的现象. 我们这里的配置文件 *-dispatcher.xml中的关键配置如下(其他常规的配置文件不在讲解,可参考本文一开始提到的入门blog): (视图配置

SpringMVC关于json、xml自动转换的原理研究[附带源码分析 --转

SpringMVC关于json.xml自动转换的原理研究[附带源码分析] 原文地址:http://www.cnblogs.com/fangjian0423/p/springMVC-xml-json-convert.html 目录 前言 现象 源码分析 实例讲解 关于配置 总结 参考资料 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC-in

SpringMVC关于json、xml自动转换的原理研究[附带源码分析]

本文讨论SpringMVC关于json.xml自动转换的原理. 实现这个功能只需要三个配置 1.springmvc配置文件 dispatcher-servlet.xml中的关键配置如下 <mvc:resources location="/static/" mapping="/static/**"/> <!-- 配置包扫描器 --> <context:component-scan base-package="com.winner

JAXB完成XML与Java对象的互转

这段时间都老忙了,甚至连周末所有人员都在赶产品的进度,想想连续上12天班,人都有点晕了!到这会儿终于有点时间,所以准备和大家分享一下JAXB,会不会有人觉得有点陌生呢?没事,这里跟大伙儿简单的描述一下: JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档.从另一方面来讲,JA

使用JAXB读写xml

1.注解 在Java模型中的创建与 xml 文件对应的节点和属性需要用注解来表示 @XmlRootElement 作用:将一个Java类映射为一段XML的根节点参数:    name  定义这个根节点的名称    namespace   定义这个根节点命名空间@XmlAccessorType  作用:定义映射这个类中的何种类型需要映射到XML.可接收四个参数,分别是:    XmlAccessType.FIELD:表示将这个类中的 非静态(static).非序列化(transient)属性映射到

使用XStream是实现XML与Java对象的转换(6)--持久化

九.持久化 在第八节的示例中,当我们操作一组对象时,我们可以指定Writer.OutputStream来写出序列化后的XML数据,我们还可以指定Reader.InputStream来读取序列化后的XML数据.当我们需要写出和读取文件时都需要指定输入输出流,并且需要明确的调用输入输出方法来实现Java对象的序列化和反序列化,其实我们完全可以让Java对象的序列化和反序列化操作隐性的.自动的完成,这就是我们要学的内容:PersistenceStrategy.XmlArrayList.XmlMap和X

Jaxb对xml报文头的小修小改

前言: 也是在实际工作中, 借助jaxb来实现xml到java对象的映射转换. 在实际应用中, 也遇到了一些有趣好玩的东西, 权当记录下来. 本文主要讲解jaxb如何生成约定的xml报文头的实现思路, 点比较小, 而且方法有点trick, 因此导致取博文标题的时候, 也有些小迷茫, ^_^. 现象: 我们先来定义一个简单的java类, 并用于生成其对应的xml内容. @Getter @Setter @NoArgsConstructor @AllArgsConstructor @XmlAccess