您的位置:首页 > 编程语言 > Java开发

XStream指定别名

2013-12-10 22:12 225 查看
XStream Alias

总结
要达到的效果
需要的Model
简单测试
类别名
字段别名
隐式集合
属性别名
包别名
 
总结
主要如下:
可以使用类的别名来改变标签名称
可以使用字段的别名来改变标签名称
可以使用包别名来改变标签名称
如果字段类型是由一个SingleValueConverter处理,可写为属性

 
要达到的效果
使用XStream生成如下格式的XML
<blogauthor="张三">
 <entry>
   <title>文章1</title>
   <description>这是文章1</description>
 </entry>
 <entry>
   <title>文章2</title>
   <description>
       这是文章2
   </description>
 </entry>
</blog>
 
需要的Model
Blog
publicclass Blog
{

private Authorwriter;

private List<Entry>entries =
new ArrayList<>();
 

public Blog(Author writer) {this.writer
= writer;}

public Author getWriter() {returnwriter;}

publicvoid setWriter(Author writer) {this.writer
= writer;}

public List<Entry> getEntries() {returnentries;}

publicvoid setEntries(List<Entry> entries) {this.entries
= entries;}
 

publicvoid add(Entry entry) {entries.add(entry);}

public List<Entry> getContent() {returnentries;}

}
Author.java
publicclass Author
{

private Stringname;

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

public String getName() {returnname;}

publicvoid setName(String name) {this.name
= name;}

}
Entry.java
publicclass Entry
{

private Stringtitle;

private Stringdescription;
 

public Entry(String title, String description) {

this.title = title;

this.description = description;

}
 

public String getTitle() {returntitle;}

publicvoid setTitle(String title) {this.title
= title;}

public String getDescription() {returndescription;}

publicvoid setDescription(String description) {this.description
= description;}

}
 
简单测试
创建Blog类实例,并使用XStream生成XML:
publicclass XStreamTest
{

publicstaticvoid
main(String[] args) {
Blog teamBlog =new
Blog(new Author("张三"));
teamBlog.add(new
Entry("文章1","这是文章1"));
teamBlog.add(new
Entry("文章2","这是文章2"));

 

XStream xstream = new XStream();

System.out.println(xstream.toXML(teamBlog));

}

}
生成的格式如下:
<xstream.Blog>
 <writer>
   <name>张三</name>
 </writer>
 <entries>
   <xstream.Entry>
     <title>文章1</title>
     <description>这是文章1</description>
   </xstream.Entry>
   <xstream.Entry>
     <title>文章2</title>
     <description>这是文章2</description>
   </xstream.Entry>
 </entries>
</xstream.Blog>
 
类别名
改变标签名xstream.Blog为blog、xstream.Entry为entry:
xstream.alias("blog", Blog.class);
xstream.alias("entry", Entry.class);
结果现在变成了:
<blog>
 <writer>
   <name>张三</name>
 </writer>
 <entries>
   <entry>
     <title>文章1</title>
     <description>这是文章1</description>
   </entry>
   <entry>
     <title>文章2</title>
     <description>这是文章2</description>
   </entry>
 </entries>
</blog>
 
字段别名
改变标签writer的名字,但这次要使用一个字段的别名:
xstream.aliasField("author", Blog.class,"writer");
现在结果变成了这样:
<blog>
 <author>
   <name>张三</name>
 </author>
 <entries>
   <entry>
     <title>文章1</title>
     <description>这是文章1</description>
   </entry>
   <entry>
     <title>文章2</title>
     <description>这是文章2</description>
   </entry>
 </entries>
</blog>
 
隐式集合
如果不需要显示 entries标签,可通过addImplicitCollection方法不让其显示:
xstream.addImplicitCollection(Blog.class,"entries");
现在的结果:
<blog>
 <author>
   <name>张三</name>
 </author>
 <entry>
   <title>文章1</title>
   <description>这是文章1</description>
 </entry>
 <entry>
   <title>文章2</title>
   <description>这是文章2</description>
 </entry>
</blog>
 
属性别名
将writer
成员变量设置为一个XML 属性。
告诉XStream,其中Blog类的 author字段将做为一个author属性:
xstream.useAttributeFor(Blog.class,"writer");
实现SingleValueConverter:
publicclass
AuthorConverterimplements SingleValueConverter { 

@Override

publicboolean canConvert(Class type) {

return type.equals(Author.class);

}

 

@Override

public Object fromString(String name) {

returnnew Author(name);

}

 

@Override

public String toString(Object obj) {

return ((Author) obj).getName();

}

}
注册这个转换器:AuthorConverter
xstream.useAttributeFor(Blog.class,"writer");
xstream.registerConverter(new AuthorConverter());
完整代码:
publicclass XStreamTest
{

publicstaticvoid
main(String[] args) {
Blog teamBlog =new
Blog(new Author("张三"));
teamBlog.add(new
Entry("文章1","这是文章1"));
teamBlog.add(new
Entry("文章2","这是文章2"));

 

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");

 
//属性别名

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

xstream.registerConverter(new AuthorConverter());

 

System.out.println(xstream.toXML(teamBlog));

}

}
运行结果:
<blogauthor="张三">
 <entry>
   <title>文章1</title>
   <description>这是文章1</description>
 </entry>
 <entry>
   <title>文章2</title>
   <description>这是文章2</description>
 </entry>
</blog>
 
属性别名
回到前面,在没有使用类别名的情况下所输出的标签名,显示的是全限定类名:xstream.Blog,现在需要将其更换为:cn.itcast.Blog
publicstaticvoid
main(String[] args) {
Blog teamBlog =new
Blog(new Author("张三"));
teamBlog.add(new
Entry("文章1","这是文章1"));
teamBlog.add(new
Entry("文章2","这是文章2"));
 

XStream xstream = new XStream();

xstream.aliasPackage("cn.itcast","xstream");

System.out.println(xstream.toXML(teamBlog));

}
结果:
<cn.itcast.Blog>
 <writer>
   <name>张三</name>
 </writer>
 <entries>
   <cn.itcast.Entry>
     <title>文章1</title>
     <description>这是文章1</description>
   </cn.itcast.Entry>
   <cn.itcast.Entry>
     <title>文章2</title>
     <description>这是文章2</description>
   </cn.itcast.Entry>
 </entries>
</cn.itcast.Blog>
 

已使用 广州传智播客 创建。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  XStream JavaXML