之前发了几篇文章几乎都是代码的,我大学快要毕业了,最近在公司里实习,有两个月不到的样子,之前在大学里也是菜鸟一个,什么也不会,进公司了,学习的机会挺多的,所以将学到的那些东西都记下来,怕是以后忘了还能再回来看看。
如果大家有什么好的意见和建议都可以提示出来。
在与其他公司接口方面,有用到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();
}
}