使用JAXB来完成Javabean与XML文件(字符串)之间的相互转换
2016-07-20 13:10
519 查看
博客搬家了, 新地址 [ http://wuwz.org ],是时候换上HEXO了
1. 什么是JAXB?
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。以上内容来自百度百科。
简单来说,你无需再使用dom4j等对XML文件进行繁琐而枯燥的解析;
现在只需要针对XML文档结构设计符合规范的Javabean,就能轻松实现两者间的转换;
一旦你开始使用它,无论两者间如何转换,你都只需要一行代码,就像下面的示例一样:
//将XML文件转换为实体对象 TbMessage message = (TbMessage) XmlBuilder.xmlFileToObject(TbMessage.class, "C:\\Msg.xml"); //将message对象转换成XML字符串 String xmlStr = XmlBuilder.convertToXml(message); //将message对象转换成文件 File xmlFile = XmlBuilder.convertToXmlFile(message, "D:\\Msg.xml"); //将XML字符串转换为message对象 TbMessage message2 = (TbMessage) XmlBuilder.xmlStrToObject(TbMessage.class, xmlStr);
2. 首先你需要一个工具类:XmlBuilder.java
package cn.org.j2ee.common; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; import java.text.MessageFormat; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import org.apache.log4j.Logger; /** * 基于JAXB的XML生成器: 用于pojo与xml文件的相互转换 * @author wuwz * @ClassName XmlBuilder * @DateTime 2016年3月29日 上午10:50:17 */ public abstract class XmlBuilder { private final static Logger log= Logger.getLogger(XmlBuilder.class); /** * 将pojo转换为XML字符串 * @param object * @return */ public static String convertToXml(Object object) { Writer sw = new StringWriter(); try { // 利用jdk中自带的转换类实现 JAXBContext context = JAXBContext.newInstance(object.getClass()); Marshaller marshaller = context.createMarshaller(); // 格式化xml输出的格式 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); // 将对象转换成输出流形式的xml marshaller.marshal(object, sw); log.debug("XML字符串生成成功!"); } catch (JAXBException e) { e.printStackTrace(); } finally { if(sw != null) { try { sw.close(); } catch (IOException e) { e.printStackTrace(); } } } return sw.toString().replace("standalone=\"yes\"", ""); } /** * 将pojo转换为XML文件 * @param obj * @param savePath */ public static File convertToXmlFile(Object obj,String savePath) { File file = null; String xmlStr = convertToXml(obj); if(xmlStr != null && !"".equals(xmlStr)) { file = new File(savePath); if(!file.exists() && file.isFile()) { try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } if(file.isDirectory()) { System.out.println(MessageFormat.format("{0}不是有效的文件路径.", savePath)); return null; } Writer writer = null; try { writer = new FileWriter(file); writer.write(xmlStr); writer.flush(); log.debug("XML文件生成成功!"); } catch (IOException e) { e.printStackTrace(); } finally { if(writer != null) { try { writer.close(); } catch (IOException e) { e.printStackTrace(); } } } } return file; } /** 4000 * 将XML文件转换为指定类型的pojo * @param clazz * @param xmlPath * @return */ public static Object xmlFileToObject(Class<?> clazz, String xmlPath) { Object xmlObject = null; Reader fr = null; try { JAXBContext context = JAXBContext.newInstance(clazz); Unmarshaller unmarshaller = context.createUnmarshaller(); fr = new FileReader(xmlPath); xmlObject = unmarshaller.unmarshal(fr); } catch (JAXBException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { if (null != fr) { try { fr.close(); } catch (IOException e) { e.printStackTrace(); } } } return xmlObject; } /** * 将XML字符串转换为指定类型的pojo * * @param clazz * @param xmlStr * @return */ public static Object xmlStrToObject(Class<?> clazz, String xmlStr) { Object xmlObject = null; Reader reader = null; try { JAXBContext context = JAXBContext.newInstance(clazz); // 进行将Xml转成对象的核心接口 Unmarshaller unmarshaller = context.createUnmarshaller(); reader = new StringReader(xmlStr); xmlObject = unmarshaller.unmarshal(reader); } catch (JAXBException e) { e.printStackTrace(); } finally { if (null != reader) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } return xmlObject; } }
3. 简单的使用例子
3.1 新建一个简单的实体
@XmlType(propOrder={ "msgId","content","createDate" }) @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name="Message") public class TbMessage { @XmlElement(name="MsgID") private Integer msgId; @XmlElement(name="Content") private String content; @XmlElement(name="CreateDate") private Date createDate; //省略getter setter、、 }
3.2 在Main方法中测试
public static void main(String[] args) { TbMessage message = new TbMessage(); message.setMsgId(110); message.setContent("这是一个测试消息"); message.setCreateDate(new Date()); String string = XmlBuilder.convertToXml(message); System.out.println(string); }
3.3 输出结果:
<?xml version="1.0" encoding="UTF-8" ?> <Message> <MsgID>110</MsgID> <Content>这是一个测试消息</Content> <CreateDate>2016-07-20T17:20:14.380+08:00</CreateDate> </Message>
4. 复杂DOM结构的实例
。。。待续相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- Python动态类型的学习---引用的理解
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序