xml java jaxb_使用JAXB实现JAVA对象和XML字符串的互相转换实例

测试类:

package com.yanek.test;

import java.util.ArrayList;

import java.util.List;

import com.yanek.test.JaxbUtil.CollectionWrapper;

public class Test {

/**

* @param args

*/

public static void main(String[] args) {

//创建java对象

Hotel hotel=new Hotel();

hotel.setId(1);

hotel.setName("name1");

RoomTypeVO t1=new RoomTypeVO();

t1.setPrice("20");

t1.setTypeid(1);

t1.setTypename("typename1");

RoomTypeVO t2=new RoomTypeVO();

t2.setPrice("30");

t2.setTypeid(2);

t2.setTypename("typename2");

List RoomTypeVOs=new ArrayList();

RoomTypeVOs.add(t1);

RoomTypeVOs.add(t2);

hotel.setRoomTypeVOs(RoomTypeVOs);

//将java对象转换为XML字符串

JaxbUtil requestBinder = new JaxbUtil(Hotel.class,

CollectionWrapper.class);

String retXml = requestBinder.toXml(hotel, "utf-8");

System.out.println("xml:"+retXml);

//将xml字符串转换为java对象

JaxbUtil resultBinder = new JaxbUtil(Hotel.class,

CollectionWrapper.class);

Hotel hotelObj = resultBinder.fromXml(retXml);

System.out.println("hotelid:"+hotelObj.getId());

System.out.println("hotelname:"+hotelObj.getName());

for(RoomTypeVO roomTypeVO:hotelObj.getRoomTypeVOs())

{

System.out.println("Typeid:"+roomTypeVO.getTypeid());

System.out.println("Typename:"+roomTypeVO.getTypename());

}

}

}

输出如下:

xml:<?xml version="1.0" encoding="utf-8" standalone="yes"?>

name1

20

typename1

30

typename2

hotelid:1

hotelname:name1

Typeid:1

Typename:typename1

Typeid:2

Typename:typename2

相关类:

package com.yanek.test;

import java.util.List;

import javax.xml.bind.annotation.XmlAttribute;

import javax.xml.bind.annotation.XmlElement;

import javax.xml.bind.annotation.XmlElementWrapper;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "hotel")

public class Hotel {

@XmlElementWrapper(name = "RoomTypeVOs")

@XmlElement(name = "RoomTypeVO")

public List getRoomTypeVOs() {

return RoomTypeVOs;

}

public void setRoomTypeVOs(List roomTypeVOs) {

RoomTypeVOs = roomTypeVOs;

}

private List RoomTypeVOs;

/@XmlElement(name = "id")

@XmlAttribute(name = "id")

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

@XmlElement(name = "name")

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

private int id;

private String name;

}

package com.yanek.test;

import javax.xml.bind.annotation.XmlAttribute;

import javax.xml.bind.annotation.XmlElement;

public class RoomTypeVO {

///@XmlElement(name = "typeid")

@XmlAttribute(name = "typeid")

public int getTypeid() {

return typeid;

}

public void setTypeid(int typeid) {

this.typeid = typeid;

}

@XmlElement(name = "typename")

public String getTypename() {

return typename;

}

public void setTypename(String typename) {

this.typename = typename;

}

@XmlElement(name = "price")

public String getPrice() {

return price;

}

public void setPrice(String price) {

this.price = price;

}

private int typeid;

private String typename;

private String price;

}

jaxb简单工具类:

package com.yanek.test;

import java.io.StringReader;

import java.io.StringWriter;

import java.util.Collection;

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 org.apache.commons.lang.StringUtils;

/**

* 使用Jaxb2.0实现XMLJava Object的Binder.

*

* 特别支持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 wrapperElement = new JAXBElement(

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 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 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;

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值