XStream的使用实例

      之前发了几篇文章几乎都是代码的,我大学快要毕业了,最近在公司里实习,有两个月不到的样子,之前在大学里也是菜鸟一个,什么也不会,进公司了,学习的机会挺多的,所以将学到的那些东西都记下来,怕是以后忘了还能再回来看看。

如果大家有什么好的意见和建议都可以提示出来。

     在与其他公司接口方面,有用到XStream这个类。想说也跟着写些小实例。XStream是一套简单实用的类库,用于序列化对象与XML对象之间的相互转换,其他都不多说,下面开始做实例喽!

     首先可以写一个XML文件edie.xml。其内容可以如下格式书写:

<?xml version="1.0" encoding="UTF-8" ?>
<Info author="Edie" version="v1.0.2">
	<Id>001</Id>
	<Name>MinMin</Name>
	<QQ>1025771464</QQ>
	<Phone>123456789</Phone>
	<Details>
		<Message>I'm Edie!</Message>
	</Details>
	<Details>
		<Message>I call my lover Shuai!</Message>
	</Details>
	<Details>
		<Message>We all like fish !</Message>
	</Details>
	<Details>
		<Message>He is my forever boy!</Message>
	</Details>
	<Details>
		<Message>嘿嘿,我是菜鸟</Message>
	</Details>
	<Details>
		<Message>Do you want know me more?</Message>
	</Details>
</Info>

 根据XMl文件的书写格式,我们可以新建几个JavaBean,一个是Info.java

package org.mm.bean;

import java.util.List;

public class Info {
private Author author;
private Version version;
private String Id;
private String Name;
private String QQ;
private String Phone;
private List<Detail> Details;
@Override
public String toString() {
    return "Info [author=" + author + ", version=" + version + ", Id=" + Id + ", Name=" + Name
            + ", QQ=" + QQ + ", Phone=" + Phone + ", Details=" + Details + "]";
}
}

 由于XML文件中,Info标签里Details是有多个的,因此在Info类中将Details定义成List。

如此一来,我们就应该明白,应该再新建一个Detail.java

package org.mm.bean;

public class Detail {
private String Message;

@Override
public String toString() {
    return "Message [Message=" + Message + "]";
}
}

 在XML文件中,我有定义两个属性,一个是author,一个是version。这两个我是分别写了两个bean,下面是Author.java

package org.mm.bean;

public class Author {
private String name;

public String getName() {
    return name;
}

public Author(String name) {
    this.name = name;
}

@Override
public String toString() {
    return "Author [name=" + name + "]";
}

}

 

Version.java

package org.mm.bean;

public class Version {

    private String version;

    public String getVersion() {
        return version;
    }

    public Version(String version) {
        this.version = version;
    }

    @Override
    public String toString() {
        return "Version [version=" + version + "]";
    }
    
}

 

最后要写一函数来运行一下。ParseXML.java

package org.mm;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.mm.bean.Detail;
import org.mm.bean.Info;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

public class ParaXML {

    public static void main(String[] args) throws Exception {
        InputStream in = new FileInputStream("./xml/edie.xml");
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        StringBuffer sb = new StringBuffer();
        String temp = br.readLine();
        while (temp != null) {
            sb.append(temp);
            temp = br.readLine();
        }
        System.err.println(sb.toString());
        XStream xstream = new XStream(new DomDriver());
        xstream.alias("Info", Info.class);

        xstream.useAttributeFor(Info.class, "author");
        xstream.useAttributeFor(Info.class, "version");
        xstream.aliasField("Author", Info.class, "author");
        xstream.aliasField("version", Info.class, "version");
        xstream.registerConverter(new AuthorConverter());
        xstream.registerConverter(new VersionConverter());
        xstream.addImplicitCollection(Info.class, "Details", Detail.class);
        xstream.alias("Details", Detail.class);
        // xstream.aliasField("Message", Detail.class, "message");
        // xstream.aliasField("Id", Info.class, "id");
        // xstream.aliasField("Name", Info.class, "name");
        // xstream.aliasField("QQ", Info.class, "qq");
        // xstream.aliasField("Phone", Info.class, "phone");
        // xstream.aliasField("Detail", Info.class, "detail");
        Info obj = (Info) xstream.fromXML(sb.toString().replaceAll("fish", "bread").replaceAll("apple", "banana"));
        System.out.println("obj:" + obj);
        String xml = xstream.toXML(obj);
        System.out.println(xml);
    }

}

 

在程序中,我们可以看到,是用FileInputStream来读XML文件的,是将xml文件以流的行式读出来,放在BufferReader里面。还有一点即是我将xstream.aliasField()都注释掉了,因为在javabean中,属性的命名和XML文件中命名一样。如果不一样,则需要用aliasField来映射。

Info的两个属性名,在这里我是写了两个Converter来转换的。AuthorConverter.java

package org.mm;

import org.mm.bean.Author;

import com.thoughtworks.xstream.converters.SingleValueConverter;

public class AuthorConverter  implements SingleValueConverter{

    @Override
    public boolean canConvert(@SuppressWarnings("rawtypes") Class type) {
        // TODO Auto-generated method stub
        return type.equals(Author.class);
    }
    @Override
    public Object fromString(String name) {
        // TODO Auto-generated method stub
        return new Author(name);
    }
    @Override
    public String toString(Object obj) {
        // TODO Auto-generated method stub
        return ((Author)obj).getName();
    }

}

 另外一个Converter是VersionConverter.java

package org.mm;

import org.mm.bean.Version;

import com.thoughtworks.xstream.converters.SingleValueConverter;

public class VersionConverter implements SingleValueConverter {

    @Override
    public boolean canConvert(@SuppressWarnings("rawtypes") Class type) {
        return type.equals(Version.class);
    }

    @Override
    public Object fromString(String version) {
        return new Version(version);
    }

    @Override
    public String toString(Object obj) {
        return ((Version) obj).getVersion();
    }

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值