java bean与xml相互转换

java bean 与xml相互转换的方式有多种。这里介绍jaxb2.0和xstream的方式。首先需要引入xstream和jaxb2.0的jar包

<dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.5</version>
</dependency>
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.2.3</version>
</dependency>

xstream方式

1. 实体类定义
1.1Book.java

public class Book {
    @XStreamAlias("Name")//通过注解的方式重定义节点名称
    private String name;
    private String author;

    public String getName() {
        return name;
    }

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

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

}

1.2Address.java

@XStreamAlias("Address")
public class Address {
    private String street;

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }
}

1.3Student.java

public class Student {

    @XStreamAlias("Name")
    private String name;
    //自定义的类型转换器
    @XStreamConverter(value=MyDateConverter.class,strings={"yyyyMMddHHmmss"})
    @XStreamAlias("Birth")
    private Date birthday;
    @XStreamAlias("Address")
    private Address address;
    @XStreamAlias("books")
    private List<Book> list;

    public String getName() {
        return name;
    }

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

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public List<Book> getList() {
        return list;
    }

    public void setList(List<Book> list) {
        this.list = list;
    }
}

2. 自定义类型转换器

/**
 * 通过注解对不同Date格式的支持
 * <p/>
 * XStream中DateConverter,它默认支持的格式是:yyyy-MM-dd HH:mm:ss.S 'UTC'
 * 通过@XStreamConverter注解可以定义自己的Date格式
 * <p/>
 * DateConverter(String defaultFormat, String[] acceptableFormats, TimeZone timeZone)
 * Construct a DateConverter with a given TimeZone
 */
public class MyDateConverter extends DateConverter {

    public MyDateConverter(String dateFormat) {

        super(dateFormat, new String[]{dateFormat}, TimeZone.getTimeZone("GMT+8"));
    }
}

3. xstream 转换工具类
工具类实现bean 和xml 之间相互转换

import com.hgsoft.yfzx.consumption.pos.entity.*;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.StaxDriver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

public abstract class XStreamUtil {

    private final static Logger logger = LoggerFactory.getLogger(XStreamUtil.class);

    private final static StaxDriver domDriver = new StaxDriver();
    private final static XStream o2x = new XStream(domDriver);
    private final static XStream x2o = new XStream(domDriver);

    private final static void initO2X() {
        List<Class> basic = new ArrayList(3);
        //需要把用到的实体类都添加,否则不会使用注解方式来定义别名,但是这样的方式不好。代码侵入大
        basic.add(Student.class);
        basic.add(Address.class);
        basic.add(Book.class);
        Class[] clazzs = new Class[basic.size()];
        设置使用注解方式来处理别名信息
        o2x.processAnnotations(basic.toArray(clazzs));
    }

    private final static void initX2O() {
        List<Class> basic = new ArrayList(3);
        basic.add(Student.class);
        basic.add(Address.class);
        basic.add(Book.class);
        Class[] clazzs = new Class[basic.size()];
        x2o.processAnnotations(basic.toArray(clazzs));
    }

    static {
        initO2X();
        initX2O();
    }

    /**
     * 实体类转xml字符串
     * @param obj 实体类
     * @return
     * @throws Exception
     */
    public static String object2Xml(Object obj) throws Exception {
        if (null == obj) {
            return null;
        }
        StringWriter writer = new StringWriter();
        o2x.toXML(obj, writer);
        return writer.toString();
    }

    /**
     * 
     * xml字符串转实体类
     * @param xml 字符串
     * @param clazz 实体类
     * @return
     */
    public static Object xml2Object(String xml, Class<?> clazz) {
        if (null == xml || "".equals(xml.trim())) {
            return null;
        }
        Object obj = null;
        try {
            obj = x2o.fromXML(xml, clazz.newInstance());
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
        return obj;
    }
}

jaxb2.0方式

1. 实体类定义
1.1Summary.java

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


@XmlRootElement(name = "Message")//表示该类是XML根元素  name属性定义了XML根元素的元素名
@XmlType(propOrder = { "authInfo", "summaryDetail" })
//定义XML的生成规则 propOrder 属性在xml里的出现顺序
public class Summary {

    private AuthInfo authInfo;
    private SummaryDetail summaryDetail;

    @XmlElement(name = "AuthInfo")//定义生成后的xml的属性名,这个和xstream区别是这个写在get方法上
    public AuthInfo getAuthInfo() {
        return authInfo;
    }

    public void setAuthInfo(AuthInfo authInfo) {
        this.authInfo = authInfo;
    }

    @XmlElement(name = "Detail")
    public SummaryDetail getSummaryDetail() {
        return summaryDetail;
    }

    public void setSummaryDetail(SummaryDetail summaryDetail) {
        this.summaryDetail = summaryDetail;
    }
}

1.2 AuthInfo.java

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

@XmlType(propOrder = { "username", "password"})//节点显示的顺序
public class AuthInfo {

    private String username;
    private String password;

    @XmlElement(name = "UserName")
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @XmlElement(name = "Password")
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

1.3 SummaryDetail.java

import com.hgsoft.yfzx.consumption.pos.util.JaxbBigDecimalAdapter;
import com.hgsoft.yfzx.consumption.pos.util.JaxbDateAdapter;
import com.hgsoft.yfzx.consumption.pos.util.JaxbThirdDateAdapter;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

@XmlType(propOrder = { "serviceId", "oprDt","bizCount" ,"bizAmount"})
public class SummaryDetail {

    private String serviceId;//服务商编号
    private Date oprDt;//交易时间
    private Integer bizCount;//交易总条数
    private BigDecimal bizAmount;//交易总金额

    @XmlElement(name = "ServiceId")
    public String getServiceId() {
        return serviceId;
    }

    public void setServiceId(String serviceId) {
        this.serviceId = serviceId;
    }

    @XmlElement(name = "OprDt")
    @XmlJavaTypeAdapter(JaxbThirdDateAdapter.class)
    public Date getOprDt() {
        return oprDt;
    }

    public void setOprDt(Date oprDt) {
        this.oprDt = oprDt;
    }

    @XmlElement(name = "BizCount")
    public Integer getBizCount() {
        return bizCount;
    }

    public void setBizCount(Integer bizCount) {
        this.bizCount = bizCount;
    }

    @XmlElement(name = "BizAmount")
    @XmlJavaTypeAdapter(JaxbBigDecimalAdapter.class)//自定义类型转换器
    public BigDecimal getBizAmount() {
        return bizAmount;
    }

    public void setBizAmount(BigDecimal bizAmount) {
        this.bizAmount = bizAmount;
    }
}

2. 自定义转换器

import javax.xml.bind.annotation.adapters.XmlAdapter;
import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * BigDeciaml保留两位小数
 */
public class JaxbBigDecimalAdapter extends XmlAdapter<String, BigDecimal> {

    private DecimalFormat df = new DecimalFormat("#0.00");

    @Override
    public BigDecimal unmarshal(String v) throws Exception {
        BigDecimal a = new BigDecimal(v);
        a = a.setScale(2, BigDecimal.ROUND_HALF_UP);
        return a;
    }

    @Override
    public String marshal(BigDecimal v) throws Exception {
        if (v != null) {
            return df.format(v);
        }
        return null;
    }

}
import javax.xml.bind.annotation.adapters.XmlAdapter;
import java.text.SimpleDateFormat;
import java.util.Date;

public class JaxbThirdDateAdapter extends XmlAdapter<String, Date> {

    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    @Override
    public Date unmarshal(String v) throws Exception {
        return sdf.parse(v);
    }

    @Override
    public String marshal(Date v) throws Exception {
        return sdf.format(v);
    }
}

3. 转换工具类
其一

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;

/**
 * XML的帮助类
 *
 * @version v1.0
 */
public class XmlHelper {
    /**
     * 将自定义数据对象转化为XML字符串
     *
     * @param clazz  自定义数据类型
     * @param object 自定义数据对象
     * @return XML字符串
     * @throws JAXBException 异常
     */
    public static String objectToXML(Class clazz, Object object)
            throws JAXBException {
        String xml = null;
        JAXBContext context = JAXBContext.newInstance(clazz);
        Marshaller m = context.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        Writer w = new StringWriter();
        m.marshal(object, w);
        xml = w.toString();
        return xml;
    }

    /**
     * 将XML字符串转化为自定义数据对象
     *
     * @param clazz 自定义数据类型
     * @param xml   XML字符串
     * @return 自定义数据对象
     * @throws JAXBException 异常
     */
    public static Object xmlToObject(Class clazz, String xml)
            throws JAXBException {
        JAXBContext context = JAXBContext.newInstance(clazz);
        Unmarshaller um = context.createUnmarshaller();
        return um.unmarshal(new StringReader(xml));
    }
}

其二

import org.apache.commons.lang.StringUtils;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.namespace.QName;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Collection;

/**
 * 使用Jaxb2.0实现XML<->Java Object的Binder.
 * <p/>
 * 特别支持Root对象是List的情形.
 *
 * @author
 */
public class JaxbUtil {
    // 多线程安全的Context.
    private JAXBContext jaxbContext;

    /**
     * @param types 所有需要序列化的Root对象的类型.
     */
    public JaxbUtil(Class<?>... types) {
        try {
            jaxbContext = JAXBContext.newInstance(types);
        } catch (JAXBException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * Java Object->Xml.
     */
    public String toXml(Object root, String encoding) {
        try {
            StringWriter writer = new StringWriter();
            createMarshaller(encoding).marshal(root, writer);
            return writer.toString();
        } catch (JAXBException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * Java Object->Xml, 特别支持对Root Element是Collection的情形.
     */
    @SuppressWarnings("unchecked")
    public String toXml(Collection root, String rootName, String encoding) {
        try {
            CollectionWrapper wrapper = new CollectionWrapper();
            wrapper.collection = root;

            JAXBElement<CollectionWrapper> wrapperElement = new JAXBElement<CollectionWrapper>(
                    new QName(rootName), CollectionWrapper.class, wrapper);

            StringWriter writer = new StringWriter();
            createMarshaller(encoding).marshal(wrapperElement, writer);

            return writer.toString();
        } catch (JAXBException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * Xml->Java Object.
     */
    @SuppressWarnings("unchecked")
    public <T> T fromXml(String xml) {
        try {
            StringReader reader = new StringReader(xml);
            return (T) createUnmarshaller().unmarshal(reader);
        } catch (JAXBException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * Xml->Java Object, 支持大小写敏感或不敏感.
     */
    @SuppressWarnings("unchecked")
    public <T> T fromXml(String xml, boolean caseSensitive) {
        try {
            String fromXml = xml;
            if (!caseSensitive)
                fromXml = xml.toLowerCase();
            StringReader reader = new StringReader(fromXml);
            return (T) createUnmarshaller().unmarshal(reader);
        } catch (JAXBException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 创建Marshaller, 设定encoding(可为Null).
     */
    public Marshaller createMarshaller(String encoding) {
        try {
            Marshaller marshaller = jaxbContext.createMarshaller();

            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

            if (StringUtils.isNotBlank(encoding)) {
                marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
            }
            return marshaller;
        } catch (JAXBException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 创建UnMarshaller.
     */
    public Unmarshaller createUnmarshaller() {
        try {
            return jaxbContext.createUnmarshaller();
        } catch (JAXBException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 封装Root Element 是 Collection的情况.
     */
    public static class CollectionWrapper {
        @SuppressWarnings("unchecked")
        @XmlAnyElement
        protected Collection collection;
    }
}

参考文章
jaxb使用教程
http://blog.csdn.net/baple/article/details/18219099

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中可以使用Java对象与XML文档相互转换,一般使用JAXB(Java Architecture for XML Binding)实现。 具体步骤如下: 1. 创建Java类,使用注解进行标记,并设置对应属性的get和set方法。 2. 创建JAXBContext对象,用于处理Java对象与XML之间的转换。 3. 创建Marshaller对象,用于将Java对象转换XML。 4. 调用Marshaller对象的marshal()方法,将Java对象转换XML,可以将转换后的XML输出到文件或控制台。 下面是一个简单的示例代码: ```java import java.io.File; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; public class BeanToXml { public static void main(String[] args) { // 创建Java对象 Person person = new Person(); person.setName("张三"); person.setAge(18); try { // 创建JAXBContext对象 JAXBContext jaxbContext = JAXBContext.newInstance(Person.class); // 创建Marshaller对象 Marshaller marshaller = jaxbContext.createMarshaller(); // 设置Marshaller属性,格式化输出XML marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 调用Marshaller对象的marshal()方法,将Java对象转换XML,并输出到控制台 marshaller.marshal(person, System.out); // 将Java对象转换XML文件 File file = new File("person.xml"); marshaller.marshal(person, file); } catch (JAXBException e) { e.printStackTrace(); } } } // Java类 import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Person { private String name; private int age; public String getName() { return name; } @XmlElement public void setName(String name) { this.name = name; } public int getAge() { return age; } @XmlElement public void setAge(int age) { this.age = age; } } ``` 运行该代码,将生成一个名为“person.xml”的XML文件,内容如下: ```xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <person> <name>张三</name> <age>18</age> </person> ``` 这就是将Java对象转换XML的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值