使用XStream注解实现Java对象与XML互相转换的代码示例
本文记录一下使用xstream这个api的注解特性对Java对象与XML字符串相互转换的一些代码示例。
我们很多人都处理过XML文件,也有很多非常成熟的第三方开源软件。如:jdom、dom4j等。虽然他们的功能非常强大,但在使用上还是有点不那么习惯。对于格式比较固定的XML文档,它的结构没有变化或是很少变化,这时将它转换成我们熟悉的Java对象来操作的话,会使工作变得更容易一些,而xstream正好可以满足这一点。
本文所用xstream的版本为:1.4.7
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.7</version>
</dependency>
还是以之前的book XML为例,先上代码。
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
@XStreamAlias("book")
public class Book {
// 别名注解,这个别名就是XML文档中的元素名,Java的属性名不一定要与别名一致
@XStreamAlias("name")
private String name;
@XStreamAlias("author")
private String author;
// 属性注解,此price就是book的属性,在XML中显示为:<book price="108">
@XStreamAsAttribute()
@XStreamAlias("price")
private String price;
省略get和set方法
}
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
@XStreamAlias("books")
public class Books {
// 隐式集合,加上这个注解可以去掉book集合最外面的<list></list>这样的标记
@XStreamImplicit
private List<Book> list;
省略get和set方法
}
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
public class XStreamHandle {
private static final String xmlString = "<books><book price=\"108\"><name>Java编程思想</name><author>Bruce Eckel</author></book><book price=\"52\"><name>Effective Java</name><author>Joshua Bloch</author></book><book price=\"118\"><name>Java 7入门经典</name><author>Ivor Horton</author></book></books>";
public static String toXml(Object obj) {
XStream xstream = new XStream(new DomDriver("utf8"));
xstream.processAnnotations(obj.getClass()); // 识别obj类中的注解
/*
// 以压缩的方式输出XML
StringWriter sw = new StringWriter();
xstream.marshal(obj, new CompactWriter(sw));
return sw.toString();
*/
// 以格式化的方式输出XML
return xstream.toXML(obj);
}
public static <T> T toBean(String xmlStr, Class<T> cls) {
XStream xstream = new XStream(new DomDriver());
xstream.processAnnotations(cls);
@SuppressWarnings("unchecked")
T t = (T) xstream.fromXML(xmlStr);
return t;
}
public static void main(String[] args) {
Books books = toBean(xmlString, Books.class);
List<Book> list = books.getList();
for(Book book : list) {
System.out.println("name=" + book.getName() + "\tauthor=" + book.getAuthor()
+ "\tprice=" + book.getPrice());
}
System.out.println(toXml(books));
}
}
除了上面示例中用的注解,xstream还有下面几种注解也经常用到。
@XstreamOmitField 忽略字段
这相当于设置某些字段为临时属性,在转换中不再起作用。
@XStreamConverter(XXX.class) 转换器
XXX.class是一个实现了com.thoughtworks.xstream.converters.Converter接口的转换器,对某些类型的值进行转换,比如布尔值类型的true或false,如果不加转换器,默认生成的值就是true或false。xstream自带了BooleanConverter转换器,可以将默认值转换成需要的文本值,如果xstream没有需要的转换器就得自己实现Converter接口来自定义转换器。
根据大象的经验,为了少给自己找麻烦,比如避免使用转换器,最好将与XML元素或属性对应的Java对象属性都设置成String类型,当然列表还是要定义成List类型的。只要不是特别奇葩,一般情况下,示例部分就能满足绝大部分的需求。
本文为菠萝大象原创,如要转载请注明出处。http://www.blogjava.net/bolo
使用XStream注解实现Java对象与XML互相转换的代码示例的更多相关文章
- JAXB实现java对象与xml之间转换
JAXB简介: 1.JAXB能够使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,这样一来可以更好的标 ...
- java对象与xml相互转换 ---- xstream
XStream是一个Java对象和XML相互转换的工具,很好很强大.提供了所有的基础类型.数组.集合等类型直接转换的支持. XStream中的核心类就是XStream类,一般来说,熟悉这个类基本就够用 ...
- JAVA对象和XML文档、原来他们之间还有这一出
最近项目开发中遇到一个问题,访问接口不再通过url地址请求的方式,而是 通过socket发送xml格式的报文到指定服务器来进行信息的统一认证.. 因此组装xml格式的报文字符串以及解析服务器返回的xm ...
- 玩转Java对象和XML相互转换
最近在项目中一直出现Java对象和XML之间的相互转换,一开始由于项目很庞大,我又是临时调度过去,导致在按照项目组长的要求进行写代码的同时,总是在这块云里雾里,最近才慢慢开始搞清楚项目中具体的使用缘由 ...
- java socket报文通信(三)java对象和xml格式文件的相互转换
前两节讲了socket服务端,客户端的建立以及报文的封装.今天就来讲一下java对象和xml格式文件的相互转换. 上一节中我们列举了一个报文格式,其实我们可以理解为其实就是一个字符串.但是我们不可能每 ...
- JAXB 实现java对象与xml之间互相转换
首先熟悉一下JAXB实现对象与xml互转时常用的一些注解使用: 1.@XmlRootElement,用于类级别的注解,对应xml的跟元素.通过name属性定义这个根节点的名称. 2.@XmlAcces ...
- jaxb 专题一(JAXB 实现java对象与xml之间互相转换)
首先熟悉一下JAXB实现对象与xml互转时常用的一些注解使用: 1.@XmlRootElement,用于类级别的注解,对应xml的跟元素.通过name属性定义这个根节点的名称. 2.@XmlAcces ...
- java对象与XML相互转化
起因 最近在公司做了一次webservice相关的任务,其中我最敢兴趣的就是webservice接受到XML对应的流以后是如何方便的转化成java对象,而java对象又是如何生成对应的XML的. 目的 ...
- Java&Xml教程(八)使用JDOM将Java对象转换为XML
在前面的教程中我们学习了如何使用JDOM解析和修改XML文件内容,本节介绍如何将Java对象转换为XML数据并生成文件. JDOM的Document类提供了便捷的方法创建元素和属性,XMLOutput ...
随机推荐
- 讯飞语音SDK Android平台使用
1. 支持功能介绍: 2. Android API主要业务接口和流程介绍 -------------------------------------------------------- 工程代码: ...
- 那些年被我坑过的Python——你来我往(第九章 selectors)
进程.线程.协程(微线程).队列的概念理解 进程进程是所有相关资源的集合,而线程是和CPU交互的最小单元进程至少包含一个线程,是主线程线程线程之间可以共享资源线程同时修改同一份数据时必须加锁,mute ...
- C++实现base64编码
将昨天的php代码改造成C++ /*base_64.h文件*/ #ifndef BASE_64_H #define BASE_64_H /** * Base64 编码/解码 * @author lir ...
- NET笔试题集
题目来源于传智播客和各大互联网,复习.重新整理贴出来. 1.简述 private. protected. public. internal.protected internal 访问修饰符和访问权限 ...
- 隐藏 response headers
1.response headers 为何物 从上图看到..这 透漏出服务器端 1.操作系统版本, IIS版本.开发语言 .以及.net framework 版本 虽然现在IIS 可以挂php .甚至 ...
- hadoop 异常 ls: Cannot access .: No such file or directory.
bin/hadoop dfs -lsls: Cannot access .: No such file or directory. bin/hadoop dfs -ls /用这个命令代替试试 原因是格 ...
- [BZOJ 3110] [Zjoi2013] K大数查询 【树套树】
题目链接: BZOJ - 3110 题目分析 这道题是一道树套树的典型题目,我们使用线段树套线段树,一层是区间线段树,一层是权值线段树.一般的思路是外层用区间线段树,内层用权值线段树,但是这样貌似会很 ...
- Asynchronous
http://sporto.github.io/blog/2012/12/09/callbacks-listeners-promises/ http://www.cnblogs.com/liuning ...
- 源代码安装GIT
参考URL:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=25150840&id=4250659 若是条件允许,从源代 ...
- ArrayList的toArray
ArrayList提供了一个将List转为数组的一个非常方便的方法toArray.toArray有两个重载的方法: 1.list.toArray(); 2.list.toArray(T[] a); ...