使用XStream是实现XML与Java对象的转换(2)--别名
来源:互联网 发布:西剑流 知乎 编辑:程序博客网 时间:2024/05/18 01:58
五、使用别名(Alias)
首先,有这样一段Java代码:
import java.util.ArrayList; import java.util.List; import com.thoughtworks.xstream.XStream; public class XStreamTest2 { public static void main(String[] args) { Blog teamBlog = new Blog(new Author("Guilherme Silveira")); teamBlog.add(new Entry("first","My first blog entry.")); teamBlog.add(new Entry("tutorial", "Today we have developed a nice alias tutorial. Tell your friends! NOW!")); XStream xstream = new XStream(); System.out.println(xstream.toXML(teamBlog)); } } class Blog { private Author writer; private List entries = new ArrayList(); public Blog(Author writer) { this.writer = writer; } public void add(Entry entry) { entries.add(entry); } public List getContent() { return entries; } } class Author { private String name; public Author(String name) { this.name = name; } public String getName() { return name; } } class Entry { private String title, description; public Entry(String title, String description) { this.title = title; this.description = description; } }
对于上面这段代码,现在我要将一个Blog对象转换成为XML字符串,产生的结果是:
Xml代码<cn.tjpu.zhw.xml.Blog> <writer> <name>Guilherme Silveira</name> </writer> <entries> <cn.tjpu.zhw.xml.Entry> <title>first</title> <description>My first blog entry.</description> </cn.tjpu.zhw.xml.Entry> <cn.tjpu.zhw.xml.Entry> <title>tutorial</title> <description>Today we have developed a nice alias tutorial. Tell your friends! NOW!</description> </cn.tjpu.zhw.xml.Entry> </entries> </cn.tjpu.zhw.xml.Blog>
但是,我要将一个Blog对象转换成为下面的XML字符串的形式:
Xml代码<blog author="Guilherme Silveira"> <entry> <title>first</title> <description>My first blog entry.</description> </entry> <entry> <title>tutorial</title> <description> Today we have developed a nice alias tutorial. Tell your friends! NOW! </description> </entry> </blog>
该怎么办呢?
这就需要用到别名转换方法了!
下面我们就一步步的调整代码:
1,给类起别名
需求:将节点cn.tjpu.zhw.xml.Blog、cn.tjpu.zhw.xml.Entry重命名为blog和entry
添加代码:
Java代码xstream.alias("blog", Blog.class); xstream.alias("entry", Entry.class);
即main方法如下:
Java代码public static void main(String[] args) { Blog teamBlog = new Blog(new Author("Guilherme Silveira")); teamBlog.add(new Entry("first","My first blog entry.")); teamBlog.add(new Entry("tutorial", "Today we have developed a nice alias tutorial. Tell your friends! NOW!")); XStream xstream = new XStream(); xstream.alias("blog", Blog.class); xstream.alias("entry", Entry.class); System.out.println(xstream.toXML(teamBlog)); }
运行结果如下:
Xml代码<blog> <writer> <name>Guilherme Silveira</name> </writer> <entries> <entry> <title>first</title> <description>My first blog entry.</description> </entry> <entry> <title>tutorial</title> <description>Today we have developed a nice alias tutorial. Tell your friends! NOW!</description> </entry> </entries> </blog>
2,给字段其别名
需求:将writer节点重命名为author节点
添加代码:
Java代码xstream.aliasField("author", Blog.class, "writer");
即main方法为:
Java代码public static void main(String[] args) { Blog teamBlog = new Blog(new Author("Guilherme Silveira")); teamBlog.add(new Entry("first","My first blog entry.")); teamBlog.add(new Entry("tutorial", "Today we have developed a nice alias tutorial. Tell your friends! NOW!")); XStream xstream = new XStream(); xstream.alias("blog", Blog.class); xstream.alias("entry", Entry.class); xstream.aliasField("author", Blog.class, "writer"); System.out.println(xstream.toXML(teamBlog)); }
运行结果如下:
Xml代码<blog> <author> <name>Guilherme Silveira</name> </author> <entries> <entry> <title>first</title> <description>My first blog entry.</description> </entry> <entry> <title>tutorial</title> <description>Today we have developed a nice alias tutorial. Tell your friends! NOW!</description> </entry> </entries> </blog>
3,使用隐式集合(Implicit Collection)
隐式集合:当你不想将一个集合的根节点呈现出来的时候,它就是一个隐式集合。
数组、Collection、Map都可以成为隐式集合。
需求:隐藏entries节点
添加代码:
Java代码xstream.addImplicitCollection(Blog.class, "entries");
则main方法如下:
Java代码public static void main(String[] args) { Blog teamBlog = new Blog(new Author("Guilherme Silveira")); teamBlog.add(new Entry("first","My first blog entry.")); teamBlog.add(new Entry("tutorial", "Today we have developed a nice alias tutorial. Tell your friends! NOW!")); XStream xstream = new XStream(); xstream.alias("blog", Blog.class); xstream.alias("entry", Entry.class); xstream.aliasField("author", Blog.class, "writer"); xstream.addImplicitCollection(Blog.class, "entries"); System.out.println(xstream.toXML(teamBlog)); }
运行结果:
Xml代码<blog> <author> <name>Guilherme Silveira</name> </author> <entry> <title>first</title> <description>My first blog entry.</description> </entry> <entry> <title>tutorial</title> <description>Today we have developed a nice alias tutorial. Tell your friends! NOW!</description> </entry> </blog>
4,给XML属性起别名
需求:将writer节点,改成blog节点的authot属性
添加代码:
Java代码xstream.useAttributeFor(Blog.class, "writer");
即main方法如下:
Java代码public static void main(String[] args) { Blog teamBlog = new Blog(new Author("Guilherme Silveira")); teamBlog.add(new Entry("first","My first blog entry.")); teamBlog.add(new Entry("tutorial", "Today we have developed a nice alias tutorial. Tell your friends! NOW!")); XStream xstream = new XStream(); xstream.alias("blog", Blog.class); xstream.alias("entry", Entry.class); xstream.useAttributeFor(Blog.class, "writer"); xstream.aliasField("author", Blog.class, "writer"); xstream.addImplicitCollection(Blog.class, "entries"); System.out.println(xstream.toXML(teamBlog)); }
但是运行的结果却是不是预想的那样:
Xml代码<blog> <author> <name>Guilherme Silveira</name> </author> <entry> <title>first</title> <description>My first blog entry.</description> </entry> <entry> <title>tutorial</title> <description>Today we have developed a nice alias tutorial. Tell your friends! NOW!</description> </entry> </blog>
可以看到,运行的结果根本就没有变化,为什么?
因为,还缺少一个转换器,XML节点的属性是一个String字符串,但是Author类不是字符串,这就需要一个转换器将Author对象转换成一个String对象、同时能够将String对象反转换为Author对象:
Java代码//定义一个转换器,如果使用,则需要在使用时注册到对应的XStream对象中 class AuthorConverter implements SingleValueConverter { /*该方法用于从Author对象中提取一个String字符串*/ public String toString(Object obj) { return ((Author) obj).getName(); } /*该方法用于从一个String字符串生成Author对象*/ public Object fromString(String name) { return new Author(name); } /*该方法告诉XStream对象,该转换器可以转换哪种类型的对象*/ public boolean canConvert(Class type) { return type.equals(Author.class); } }
新的main方法如下:
Java代码public class XStreamTest2 { public static void main(String[] args) { Blog teamBlog = new Blog(new Author("Guilherme Silveira")); teamBlog.add(new Entry("first","My first blog entry.")); teamBlog.add(new Entry("tutorial", "Today we have developed a nice alias tutorial. Tell your friends! NOW!")); XStream xstream = new XStream(); xstream.alias("blog", Blog.class); xstream.alias("entry", Entry.class); //设置XML节点的属性 xstream.useAttributeFor(Blog.class, "writer"); //注册转换器 xstream.registerConverter(new AuthorConverter()); xstream.aliasField("author", Blog.class, "writer"); xstream.addImplicitCollection(Blog.class, "entries"); System.out.println(xstream.toXML(teamBlog)); } }
到此为止,运行的结果就会真正的向预期的那样:
Xml代码
<blog author="Guilherme Silveira"> <entry> <title>first</title> <description>My first blog entry.</description> </entry> <entry> <title>tutorial</title> <description>Today we have developed a nice alias tutorial. Tell your friends! NOW!</description> </entry> </blog>
5,使用包名别名
需求:有时候需要事项不同包里面的相同类名的节点之间的相互映射,这时就需要改变一下包名了
添加代码:
Java代码xstream.aliasPackage("org.thoughtworks", "cn.tjpu.zhw.xml");
即更改main方法:
Java代码public static void main(String[] args) { Blog teamBlog = new Blog(new Author("Guilherme Silveira")); teamBlog.add(new Entry("first","My first blog entry.")); teamBlog.add(new Entry("tutorial", "Today we have developed a nice alias tutorial. Tell your friends! NOW!")); XStream xstream = new XStream(); //包名别名 xstream.aliasPackage("org.thoughtworks", "cn.tjpu.zhw.xml"); System.out.println(xstream.toXML(teamBlog)); }
运行结果如下:
Xml代码<org.thoughtworks.Blog> <writer> <name>Guilherme Silveira</name> </writer> <entries> <org.thoughtworks.Entry> <title>first</title> <description>My first blog entry.</description> </org.thoughtworks.Entry> <org.thoughtworks.Entry> <title>tutorial</title> <description>Today we have developed a nice alias tutorial. Tell your friends! NOW!</description> </org.thoughtworks.Entry> </entries> </org.thoughtworks.Blog>
阅读全文
0 0
- 使用XStream是实现XML与Java对象的转换(2)--别名
- 使用XStream是实现XML与Java对象的…
- 使用XStream是实现XML与Java对象的转换(1)--简介及入门示例
- 使用 XStream 实现 Java 对象与 XML 的相互转换
- 使用XStream注解实现Java对象与XML互相转换的代码示例
- 使用XStream注解实现Java对象与XML互相转换的代码示例
- 使用XStream注解实现Java对象与XML互相转换的代码示例---转自:http://www.blogjava.net/bolo
- java 使用XStream Java对象和XML之间的转换
- XStream转换Java对象与XML
- XStream转换java对象与XML
- xstream实现java对象和XML的互相转换
- 使用XStream java对象转换成XML遇到的问题
- 使用XStream实现xml与JavaBean之间的转换
- XStream实现xml和java对象之间的互相转换(包括对属性,别名,下划线_的处理),同理JSON也可以
- java中使用XStream实现将对象转为xml格式字符串或者将xml格式的字符串转换为对象
- 使用XStream, 对于java object与xml之间的转换
- 使用XStream实现Java对象与XML之间的快速互转
- JAXB与XStream之java对象与xml转换
- VMware ESXi 5.5安装Redhat5.5时的诡异报错
- 最权威的 Android Oreo 新特性详解
- CentOS 6.5下yum安装 MySQL-5.5全过程图文教程
- 爬取知乎的一些思路
- 闲谈寻址-DNS的多级缓存系统
- 使用XStream是实现XML与Java对象的转换(2)--别名
- spring 源码学习笔记(二)—— spring ioc 之依赖注入
- 卷积神经网络的卷积层和池化层
- 【mybatis】mybatis入门
- 代码日志之路
- (二)Lucene中Field.Store.YES或者NO
- SVN cleanup失败的解决方案
- 简单记录当前情况
- C语言中常用操作符