使用XStream注解实现Java对象与XML互相转换的代码示例---转自:http://www.blogjava.net/bolo

转载 2014年09月10日 12:02:58
本文记录一下使用xstream这个api的注解特性Java对象与XML字符串相互转换的一些代码示例。
    我们很多人都处理过XML文件,也有很多非常成熟的第三方开源软件。如:jdomdom4j等。虽然他们的功能非常强大,但在使用上还是有点不那么习惯。对于格式比较固定的XML文档,它的结构没有变化或是很少变化,这时将它转换成我们熟悉的Java对象来操作的话,会使工作变得更容易一些,而xstream正好可以满足这一点。
    本文所用xstream的版本为:1.4.7
   <dependency>
       <groupId>com.thoughtworks.xstream</groupId>
       <artifactId>xstream</artifactId>
       <version>1.4.7</version>
   </dependency>
    还是以之前的book XML为例,先上代码。
import com.thoughtworks.xstream.annotations.XStreamAlias;
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 java.util.List;

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 java.util.List;

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接口的转换器,对某些类型的值进行转换,比如布尔值类型的truefalse,如果不加转换器,默认生成的值就是truefalsexstream自带了BooleanConverter转换器,可以将默认值转换成需要的文本值,如果xstream没有需要的转换器就得自己实现Converter接口来自定义转换器。
    根据大象的经验,为了少给自己找麻烦,比如避免使用转换器,最好将与XML元素或属性对应的Java对象属性都设置成String类型,当然列表还是要定义成List类型的。只要不是特别奇葩,一般情况下,示例部分就能满足绝大部分的需求。

相关文章推荐

使用 XStream 把 Java 对象序列化为 XML(本文转载自http://www.blogjava.net/zlkn2005/archive/2005/12/16/24240.html)

XStream   使用 XStream 的初衷   研究和使用 XStream 的原因是我在项目中的一个预研。在项目中需要应用到对 XML 文件的管理和配置,因此需要一个能够将对象保存为 X...

JavaEE应用中MySQL中文乱码完全解决方案----转自:http://www.blogjava.net/bolo

相信很多使用MySQL数据库做开发的朋友,都或多或少的遇到过中文乱码的问题。大象根据项目实践,在此将自己的成功经验总结拿出来和大家分享。     我使用的MySQL数据库版本是5.0.27,按以下几...

使用XStream注解实现Java对象与XML互相转换的代码示例

本文记录一下使用xstream这个api的注解特性对Java对象与XML字符串相互转换的一些代码示例。     我们很多人都处理过XML文件,也有很多非常成熟的第三方开源软件。如:jdom、dom4...

使用XStream注解实现Java对象与XML互相转换的代码示例

一定要对XStream的注解有一定的认识,最起码要知道每个注解是什么意思!! 代码实现: 1.创建java对象 1.1分别创建Book和Books对象package com.xd.bean;im...

XML ANNOTATION 转自http://www.blogjava.net/hoojo/archive/2012/10/31/390515.html

xml annotation 首先看看两种配置的优缺点比较 XML它是无可代替的超文本标记语言,可读性、传输性好,它还具有一下优点: 1、可读性、传输性好:XML可扩展标记语言,最大的优势...

poj里java的一些常用的语法(转自博客http://www.blogjava.net/DreamAngel/archive/2009/10/18/298731.html)

这里指的java速成,只限于java语法,包括输入输出,运算处理,字符串和高精度的处理,进制之间的转换等,能解决OJ上的一些高精度题目。 1. 输入: 格式为:Scanner cin = new ...

java面试题及答案(基础题122道,代码题19道)http://www.blogjava.net/fanyingjie/archive/2007/06/27/126467.aspx

JAVA相关基础知识 1、面向对象的特征有哪些方面  1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的...
  • Moonant
  • Moonant
  • 2013年08月24日 10:30
  • 976

svm入门 转自 http://www.blogjava.net/zhenandaci/archive/2009/02/13/254519.html

SVM入门(一)至(三)Refresh 按:之前的文章重新汇编一下,修改了一些错误和不当的说法,一起复习,然后继续SVM之旅. (一)SVM的八股简介 支持向量机(Support Vecto...

JavaScript学习笔记——事件(转自:http://www.blogjava.net/amigoxie/archive/2007/08/27/139711.html)

说明:本文为《JavaScript高级程序设计》第9章学习笔记。一.今天的事件 事件是DOM的一部分,在DOM Level1中未定义任何事件,在Level中定义了一小部分子集,完整的事件是在Level...
  • lslxdx
  • lslxdx
  • 2011年05月20日 00:28
  • 574

struts 笔记 转自 http://www.blogjava.net/hoojo/archive/2012/01/29/368972.html

Struts 笔记 转自 http://www.blogjava.net/hoojo/archive/2012/01/29/368972.html Struts 概述     随着MVC ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用XStream注解实现Java对象与XML互相转换的代码示例---转自:http://www.blogjava.net/bolo
举报原因:
原因补充:

(最多只允许输入30个字)