五、使用别名(Alias)

首先,有这样一段Java代码:

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import com.thoughtworks.xstream.XStream;
  4. public class XStreamTest2 {
  5. public static void main(String[] args) {
  6. Blog teamBlog = new Blog(new Author("Guilherme Silveira"));
  7. teamBlog.add(new Entry("first","My first blog entry."));
  8. teamBlog.add(new Entry("tutorial",
  9. "Today we have developed a nice alias tutorial. Tell your friends! NOW!"));
  10. XStream xstream = new XStream();
  11. System.out.println(xstream.toXML(teamBlog));
  12. }
  13. }
  14. class Blog {
  15. private Author writer;
  16. private List entries = new ArrayList();
  17. public Blog(Author writer) {
  18. this.writer = writer;
  19. }
  20. public void add(Entry entry) {
  21. entries.add(entry);
  22. }
  23. public List getContent() {
  24. return entries;
  25. }
  26. }
  27. class Author {
  28. private String name;
  29. public Author(String name) {
  30. this.name = name;
  31. }
  32. public String getName() {
  33. return name;
  34. }
  35. }
  36. class Entry {
  37. private String title, description;
  38. public Entry(String title, String description) {
  39. this.title = title;
  40. this.description = description;
  41. }
  42. }

对于上面这段代码,现在我要将一个Blog对象转换成为XML字符串,产生的结果是:

  1. <cn.tjpu.zhw.xml.Blog>
  2. <writer>
  3. <name>Guilherme Silveira</name>
  4. </writer>
  5. <entries>
  6. <cn.tjpu.zhw.xml.Entry>
  7. <title>first</title>
  8. <description>My first blog entry.</description>
  9. </cn.tjpu.zhw.xml.Entry>
  10. <cn.tjpu.zhw.xml.Entry>
  11. <title>tutorial</title>
  12. <description>Today we have developed a nice alias tutorial. Tell your friends! NOW!</description>
  13. </cn.tjpu.zhw.xml.Entry>
  14. </entries>
  15. </cn.tjpu.zhw.xml.Blog>

但是,我要将一个Blog对象转换成为下面的XML字符串的形式:

  1. <blog author="Guilherme Silveira">
  2. <entry>
  3. <title>first</title>
  4. <description>My first blog entry.</description>
  5. </entry>
  6. <entry>
  7. <title>tutorial</title>
  8. <description>
  9. Today we have developed a nice alias tutorial. Tell your friends! NOW!
  10. </description>
  11. </entry>
  12. </blog>

该怎么办呢?

这就需要用到别名转换方法了!

下面我们就一步步的调整代码:

1,给类起别名

需求:将节点cn.tjpu.zhw.xml.Blogcn.tjpu.zhw.xml.Entry重命名为blogentry

添加代码:

  1. xstream.alias("blog", Blog.class);
  2. xstream.alias("entry", Entry.class);

即main方法如下:

  1. public static void main(String[] args) {
  2. Blog teamBlog = new Blog(new Author("Guilherme Silveira"));
  3. teamBlog.add(new Entry("first","My first blog entry."));
  4. teamBlog.add(new Entry("tutorial",
  5. "Today we have developed a nice alias tutorial. Tell your friends! NOW!"));
  6. XStream xstream = new XStream();
  7. xstream.alias("blog", Blog.class);
  8. xstream.alias("entry", Entry.class);
  9. System.out.println(xstream.toXML(teamBlog));
  10. }

运行结果如下:

  1. <blog>
  2. <writer>
  3. <name>Guilherme Silveira</name>
  4. </writer>
  5. <entries>
  6. <entry>
  7. <title>first</title>
  8. <description>My first blog entry.</description>
  9. </entry>
  10. <entry>
  11. <title>tutorial</title>
  12. <description>Today we have developed a nice alias tutorial. Tell your friends! NOW!</description>
  13. </entry>
  14. </entries>
  15. </blog>

2,给字段其别名

需求:将writer节点重命名为author节点

添加代码:

  1. xstream.aliasField("author", Blog.class, "writer");

即main方法为:

  1. public static void main(String[] args) {
  2. Blog teamBlog = new Blog(new Author("Guilherme Silveira"));
  3. teamBlog.add(new Entry("first","My first blog entry."));
  4. teamBlog.add(new Entry("tutorial",
  5. "Today we have developed a nice alias tutorial. Tell your friends! NOW!"));
  6. XStream xstream = new XStream();
  7. xstream.alias("blog", Blog.class);
  8. xstream.alias("entry", Entry.class);
  9. xstream.aliasField("author", Blog.class, "writer");
  10. System.out.println(xstream.toXML(teamBlog));
  11. }

运行结果如下:

  1. <blog>
  2. <author>
  3. <name>Guilherme Silveira</name>
  4. </author>
  5. <entries>
  6. <entry>
  7. <title>first</title>
  8. <description>My first blog entry.</description>
  9. </entry>
  10. <entry>
  11. <title>tutorial</title>
  12. <description>Today we have developed a nice alias tutorial. Tell your friends! NOW!</description>
  13. </entry>
  14. </entries>
  15. </blog>

3,使用隐式集合(Implicit Collection)

隐式集合:当你不想将一个集合的根节点呈现出来的时候,它就是一个隐式集合。

数组、Collection、Map都可以成为隐式集合。

需求:隐藏entries节点

添加代码:

  1. xstream.addImplicitCollection(Blog.class, "entries");

则main方法如下:

  1. public static void main(String[] args) {
  2. Blog teamBlog = new Blog(new Author("Guilherme Silveira"));
  3. teamBlog.add(new Entry("first","My first blog entry."));
  4. teamBlog.add(new Entry("tutorial",
  5. "Today we have developed a nice alias tutorial. Tell your friends! NOW!"));
  6. XStream xstream = new XStream();
  7. xstream.alias("blog", Blog.class);
  8. xstream.alias("entry", Entry.class);
  9. xstream.aliasField("author", Blog.class, "writer");
  10. xstream.addImplicitCollection(Blog.class, "entries");
  11. System.out.println(xstream.toXML(teamBlog));
  12. }

运行结果:

  1. <blog>
  2. <author>
  3. <name>Guilherme Silveira</name>
  4. </author>
  5. <entry>
  6. <title>first</title>
  7. <description>My first blog entry.</description>
  8. </entry>
  9. <entry>
  10. <title>tutorial</title>
  11. <description>Today we have developed a nice alias tutorial. Tell your friends! NOW!</description>
  12. </entry>
  13. </blog>

4,给XML属性起别名

需求:将writer节点,改成blog节点的authot属性

添加代码:

  1. xstream.useAttributeFor(Blog.class, "writer");

即main方法如下:

  1. public static void main(String[] args) {
  2. Blog teamBlog = new Blog(new Author("Guilherme Silveira"));
  3. teamBlog.add(new Entry("first","My first blog entry."));
  4. teamBlog.add(new Entry("tutorial",
  5. "Today we have developed a nice alias tutorial. Tell your friends! NOW!"));
  6. XStream xstream = new XStream();
  7. xstream.alias("blog", Blog.class);
  8. xstream.alias("entry", Entry.class);
  9. xstream.useAttributeFor(Blog.class, "writer");
  10. xstream.aliasField("author", Blog.class, "writer");
  11. xstream.addImplicitCollection(Blog.class, "entries");
  12. System.out.println(xstream.toXML(teamBlog));
  13. }

但是运行的结果却是不是预想的那样:

  1. <blog>
  2. <author>
  3. <name>Guilherme Silveira</name>
  4. </author>
  5. <entry>
  6. <title>first</title>
  7. <description>My first blog entry.</description>
  8. </entry>
  9. <entry>
  10. <title>tutorial</title>
  11. <description>Today we have developed a nice alias tutorial. Tell your friends! NOW!</description>
  12. </entry>
  13. </blog>

可以看到,运行的结果根本就没有变化,为什么?

因为,还缺少一个转换器,XML节点的属性是一个String字符串,但是Author类不是字符串,这就需要一个转换器将Author对象转换成一个String对象、同时能够将String对象反转换为Author对象:

  1. //定义一个转换器,如果使用,则需要在使用时注册到对应的XStream对象中
  2. class AuthorConverter implements SingleValueConverter {
  3. /*该方法用于从Author对象中提取一个String字符串*/
  4. public String toString(Object obj) {
  5. return ((Author) obj).getName();
  6. }
  7. /*该方法用于从一个String字符串生成Author对象*/
  8. public Object fromString(String name) {
  9. return new Author(name);
  10. }
  11. /*该方法告诉XStream对象,该转换器可以转换哪种类型的对象*/
  12. public boolean canConvert(Class type) {
  13. return type.equals(Author.class);
  14. }
  15. }

新的main方法如下:

  1. public class XStreamTest2 {
  2. public static void main(String[] args) {
  3. Blog teamBlog = new Blog(new Author("Guilherme Silveira"));
  4. teamBlog.add(new Entry("first","My first blog entry."));
  5. teamBlog.add(new Entry("tutorial",
  6. "Today we have developed a nice alias tutorial. Tell your friends! NOW!"));
  7. XStream xstream = new XStream();
  8. xstream.alias("blog", Blog.class);
  9. xstream.alias("entry", Entry.class);
  10. //设置XML节点的属性
  11. xstream.useAttributeFor(Blog.class, "writer");
  12. //注册转换器
  13. xstream.registerConverter(new AuthorConverter());
  14. xstream.aliasField("author", Blog.class, "writer");
  15. xstream.addImplicitCollection(Blog.class, "entries");
  16. System.out.println(xstream.toXML(teamBlog));
  17. }
  18. }

到此为止,运行的结果就会真正的向预期的那样:

  1. <blog author="Guilherme Silveira">
  2. <entry>
  3. <title>first</title>
  4. <description>My first blog entry.</description>
  5. </entry>
  6. <entry>
  7. <title>tutorial</title>
  8. <description>Today we have developed a nice alias tutorial. Tell your friends! NOW!</description>
  9. </entry>
  10. </blog>

5,使用包名别名

需求:有时候需要事项不同包里面的相同类名的节点之间的相互映射,这时就需要改变一下包名了

添加代码:

  1. xstream.aliasPackage("org.thoughtworks", "cn.tjpu.zhw.xml");

即更改main方法:

  1. public static void main(String[] args) {
  2. Blog teamBlog = new Blog(new Author("Guilherme Silveira"));
  3. teamBlog.add(new Entry("first","My first blog entry."));
  4. teamBlog.add(new Entry("tutorial",
  5. "Today we have developed a nice alias tutorial. Tell your friends! NOW!"));
  6. XStream xstream = new XStream();
  7. //包名别名
  8. xstream.aliasPackage("org.thoughtworks", "cn.tjpu.zhw.xml");
  9. System.out.println(xstream.toXML(teamBlog));
  10. }

运行结果如下:

  1. <org.thoughtworks.Blog>
  2. <writer>
  3. <name>Guilherme Silveira</name>
  4. </writer>
  5. <entries>
  6. <org.thoughtworks.Entry>
  7. <title>first</title>
  8. <description>My first blog entry.</description>
  9. </org.thoughtworks.Entry>
  10. <org.thoughtworks.Entry>
  11. <title>tutorial</title>
  12. <description>Today we have developed a nice alias tutorial. Tell your friends! NOW!</description>
  13. </org.thoughtworks.Entry>
  14. </entries>
  15. </org.thoughtworks.Blog>

使用XStream是实现XML与Java对象的转换(2)--别名的更多相关文章

  1. 使用XStream是实现XML与Java对象的转换(6)--持久化

    九.持久化 在第八节的示例中,当我们操作一组对象时,我们可以指定Writer.OutputStream来写出序列化后的XML数据,我们还可以指定Reader.InputStream来读取序列化后的XM ...

  2. 使用XStream是实现XML与Java对象的转换(4)--转换器

    七.转换器(Converter) 我们程序中的POJO是千变万化的,而且需求也是千奇百怪的,所以XStream中的内置的转换器的功能不一定能够满足我们的要求,所以我们就需要自己构建转换器. 1,一个基 ...

  3. 使用XStream是实现XML与Java对象的转换(3)--注解

    六.使用注解(Annotation) 总是使用XStream对象的别名方法和注册转换器,会让人感到非常的乏味,又会产生很多重复性代码,于是我们可以使用注解的方式来配置要序列化的POJO对象. 1,最基 ...

  4. 使用XStream是实现XML与Java对象的转换(1)--简介及入门示例

    一.简单介绍 XStream是thoughtworks开发的开源框架,用于实现XML数据于Java对象.Json数据的转换.它不需要schema或其他的mapping文件就可以进行java对象和xml ...

  5. 使用XStream是实现XML与Java对象的转换(5)--Object Stream

    八,Object Stream 之前的例子我们都是直接输出Xml成为String类型或者从String中获得并解析Xml,现在我们要处理输入流和输出流! 1,输出流(ObjectOutputStrea ...

  6. 不规矩的xml与JAVA对象互相转换的小技巧-使用Marshaller

    摘要:将XML文档与JAVA对象互转是很常见的需求,如果XML定义很规整这很好实现.然而在现实中“不规矩”的XML可能更常见,Marshaller便无能为力了吗?下面是一个小技巧,调整一下思维便能重用 ...

  7. XStream轻松转换xml和java对象

    首先引入所需的jar: xstream-1.4.9.xpp3_min-1.1.4c.dom4j-1.6.1, 或用maven管理jar包时在pom.xml中添加: <!-- https://mv ...

  8. xml-mapping xml 与 java 对象转换映射框架,像 XStream 一样优雅地读写xml

    xml xml 是 java 实现的 xml 框架. 希望以最优雅的方式进行 xml 和 java 之间的转换处理,一行代码搞定一切. 特点 对象的和 xml 的互相映射 支持注解 @Alias 指定 ...

  9. XML 和 java对象相互转换

    XML 和 java对象相互转换 博客分类: XML 和 JSON   下面使用的是JDK自带的类,没有引用任何第三方jar包. Unmarshaller 类使客户端应用程序能够将 XML 数据转换为 ...

随机推荐

  1. TCP连接建立系列 — 客户端的端口选取和重用

    主要内容:connect()时的端口选取和端口重用. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 端口选取 connect()时本地端口是如何选取的呢 ...

  2. (一一九)通过CALayer实现阴影、圆角、边框和3D变换

    在每个View上都有一个CALayer作为父图层,View的内容作为子层显示,通过layer的contents属性决定了要显示的内容,通过修改过layer的一些属性可以实现一些华丽的效果. [阴影和圆 ...

  3. acm入门搜索-石油数目

    题意:给出一个N*M的矩形区域和每个区域的状态--有/没有石油,(定义)如果两个有石油的区域是相邻的(水平.垂直.斜)则认为这是属于同一个oil pocket. 求这块矩形区域一共有多少oilpock ...

  4. cocos2dx 3.3 C++工程添加lua支持

    准备工作: 1. 拷贝cocos2d-x-3.3rc0\external\lua整个文件夹到项目中(如myProject\cocos2d\external\lua) 2. 拷贝cocos2d-x-3. ...

  5. MySQL设计软件登录模块

    学了一段时间的Java了,思量着做一点简单的小模块的东西吧,于是就有了下面的这个简单的小案例. 大致实现的功能就是注册于登录还有就是用到了一点,分层思想.仅此而已,所以非常的适合新手围观. 建立好数据 ...

  6. pig里面没有if:不能判断一个条件后决定一个执行步骤

    pig是处理流 的工具,所以数据集是流对象,处理步骤也是一样的. Pig中存在按条件处理流对象的方式有 1)filter X= FILTER A BY (f1 == 8); 2)CASE WHEN T ...

  7. ajax核心技术1---XMLHttpRequset对象的使用

    AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.AJAX = 异步 Ja ...

  8. Cocos2D中Node的userObject实例变量使用时一个要注意的地方

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们知道在Cocos2D中,CCNode对象有一个ivar为us ...

  9. Java-IO之RandomAccessFile

    RandomAccessFile是随机访问(读写)的类,支持对文件随机访问的读取和写入,也可以从指定的位置读取和写入文件数据.RandomAccessFile虽然属于java.io包,但它不是Inpu ...

  10. 【leetcode77】Single Number

    一题目描述: 给定一个数组,只有一个数字出现一次,其余都是两次,判断那个数字 思路: 不断取出数据进行异或,最后一个数字,因为相同的数字会抵消 代码: public class Solution { ...