本文记录一下使用xstream这个api的注解特性对Java对象与XML字符串相互转换的一些代码示例。
    我们很多人都处理过XML文件,也有很多非常成熟的第三方开源软件。如:jdom、dom4j等。虽然他们的功能非常强大,但在使用上还是有点不那么习惯。对于格式比较固定的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接口的转换器,对某些类型的值进行转换,比如布尔值类型的true或false,如果不加转换器,默认生成的值就是true或false。xstream自带了BooleanConverter转换器,可以将默认值转换成需要的文本值,如果xstream没有需要的转换器就得自己实现Converter接口来自定义转换器。
    根据大象的经验,为了少给自己找麻烦,比如避免使用转换器,最好将与XML元素或属性对应的Java对象属性都设置成String类型,当然列表还是要定义成List类型的。只要不是特别奇葩,一般情况下,示例部分就能满足绝大部分的需求。
    本文为菠萝大象原创,如要转载请注明出处。http://www.blogjava.net/bolo

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

  1. JAXB实现java对象与xml之间转换

    JAXB简介: 1.JAXB能够使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,这样一来可以更好的标 ...

  2. java对象与xml相互转换 ---- xstream

    XStream是一个Java对象和XML相互转换的工具,很好很强大.提供了所有的基础类型.数组.集合等类型直接转换的支持. XStream中的核心类就是XStream类,一般来说,熟悉这个类基本就够用 ...

  3. JAVA对象和XML文档、原来他们之间还有这一出

    最近项目开发中遇到一个问题,访问接口不再通过url地址请求的方式,而是 通过socket发送xml格式的报文到指定服务器来进行信息的统一认证.. 因此组装xml格式的报文字符串以及解析服务器返回的xm ...

  4. 玩转Java对象和XML相互转换

    最近在项目中一直出现Java对象和XML之间的相互转换,一开始由于项目很庞大,我又是临时调度过去,导致在按照项目组长的要求进行写代码的同时,总是在这块云里雾里,最近才慢慢开始搞清楚项目中具体的使用缘由 ...

  5. java socket报文通信(三)java对象和xml格式文件的相互转换

    前两节讲了socket服务端,客户端的建立以及报文的封装.今天就来讲一下java对象和xml格式文件的相互转换. 上一节中我们列举了一个报文格式,其实我们可以理解为其实就是一个字符串.但是我们不可能每 ...

  6. JAXB 实现java对象与xml之间互相转换

    首先熟悉一下JAXB实现对象与xml互转时常用的一些注解使用: 1.@XmlRootElement,用于类级别的注解,对应xml的跟元素.通过name属性定义这个根节点的名称. 2.@XmlAcces ...

  7. jaxb 专题一(JAXB 实现java对象与xml之间互相转换)

    首先熟悉一下JAXB实现对象与xml互转时常用的一些注解使用: 1.@XmlRootElement,用于类级别的注解,对应xml的跟元素.通过name属性定义这个根节点的名称. 2.@XmlAcces ...

  8. java对象与XML相互转化

    起因 最近在公司做了一次webservice相关的任务,其中我最敢兴趣的就是webservice接受到XML对应的流以后是如何方便的转化成java对象,而java对象又是如何生成对应的XML的. 目的 ...

  9. Java&Xml教程(八)使用JDOM将Java对象转换为XML

    在前面的教程中我们学习了如何使用JDOM解析和修改XML文件内容,本节介绍如何将Java对象转换为XML数据并生成文件. JDOM的Document类提供了便捷的方法创建元素和属性,XMLOutput ...

随机推荐

  1. php文件加锁 lock_sh ,lock_ex

    文件锁有两种:共享锁和排他锁,也就是读锁(LOCK_SH)和写锁(LOCK_EX) 文件的锁一般这么使用: $fp = fopen("filename", "a" ...

  2. coffee 编译时, 用本地环境

    export PATH="./node_modules/.bin:$PATH" 原文: How to use package installed locally in node_m ...

  3. js创建对象的三种方法:文本标识法和构造器函数法和返回对象的函数

    文本标识法和定义变量差不多,像这样 var obj = {name:'HanMM','2':'Dali'}; 函数构造器法  先创建一个对象函数 function Obj() { this.addre ...

  4. Fedora 18安装Google输入法和云拼音

    由于sunpinyin的词库选词太不准,网友推荐在Fedora 18下使用谷歌拼音及云拼音,于是想要尝试下怎么样.由于fedora 源中谷歌拼音所以选择自行编译,做下记录以备份. #安装fcitx $ ...

  5. php中文字符串反转

    <?php header("content-type:text/html;charset=utf-8"); /** 此函数的作用是反转中文字符串 mb_strlen() 获取 ...

  6. 每个Linux新手都应该记住的10个基本Linux命令

    Linux对我们的生活有着很大的影响.至少,你的安卓手机上面就有Linux内核.然而,头一次入手Linux只会让你觉得不适.因为在Linux上,你通常应该使用终端命令,而不是只要点击启动器图像(就像你 ...

  7. Python自动化运维之22、JavaScript

    一.简介 JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理.学习了htm ...

  8. Trigger model Trigger expr_id in WorkFolow

    For example, suppose you want to set a Sale Order into the state "Done" once it has been s ...

  9. newman安装时遇到问题的解决

    npm安装newman时系统提示需要安装.net framwork环境 通过查询文档安装visual studio express: 于是安装visual studio 2012 express. 安 ...

  10. 使用java求高精度除法,要求保留N位小数

    题目要求是高精度除法,要求保留N位小数(四舍五入),并且当整数部分为0时去除0的显示 import java.math.BigDecimal; import java.util.Scanner; pu ...