`
tuxq5721
  • 浏览: 33347 次
社区版块
存档分类
最新评论

XStream指定别名

阅读更多

总结

要达到的效果

需要的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.Blogblogxstream.Entryentry

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 XML与Json转换

    但是当对象和字段名与XML中的元素名不同时,XStream支持指定别名。XStream支持以方法调用的方式,或是Java 标注的方式指定别名。 XStream在进行数据类型转换时,使用系统缺省的类型转换器。同时,也支持用户自定义...

    解决XStream注解同名冲突

    com.thoughtworks.xstream.converters.ConversionException: No field 'null' found in class '.....(注解的类路径)' ---- Debugging information ---- message : No field 'null' found in class '.....' cause...

    最齐全的xstream1.4.8.jar

    最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar ...

    xstream-1.4.15.jar

    XStream 反序列化漏洞(CVE-2020-26258 & 26259),修复jar包 xstream-1.4.15.jar Xstream 是 Java 类库,用来将对象序列化成 XML (JSON) 或反序列化为对象。XStream 是一款开源软件,允许在 BSD 许可证的许可下分发...

    xstream最新版 - xstream-1.4.18.jar

    xstream最新版jar包

    xstream-1.4.11-API文档-中文版.zip

    赠送jar包:xstream-1.4.11.jar; 赠送原API文档:xstream-1.4.11-javadoc.jar; 赠送源代码:xstream-1.4.11-sources.jar; 赠送Maven依赖信息文件:xstream-1.4.11.pom; 包含翻译后的API文档:xstream-1.4.11-...

    xstream-1.4.19.jar

    xstream-1.4.19.jar

    XStream及依赖包

    最新最全的XStream及其依赖包,测试ok才发布,欢迎大家下载!最新最全的XStream及其依赖包,测试ok才发布,欢迎大家下载!

    xstream-1.4.jar

    xstream jar包,java对象转xml以及xml转java对象,操作很简单。

    xstream1.22.jar

    xstream 1.2 ,xstream 1.2.2.jar xstream 1.2 ,xstream 1.2.2.jar

    xstream-1.4.2.jar

    xstream-1.4.2.jar,官网上也有,由于本人分没了,希望有分的同志给点分。如果你也每份,请上官网下,地址:http://xstream.codehaus.org/download.html

    xstream-1.4.7.jar

    xstream-1.4.7.jar XML

    XStream解析XML实例

    XStream解析XML实例

    XStream DOC

    XStream DOC

    xstream-1.4.5.jar

    xstream xstream-1.4.5.jar

    xstream-1.4.2

    xstream-1.4.2

    xstream相关的jar包

    xstream所需要的jar包,xstream-1.4.9.jar、dom4j-1.6.1.jar、xpp3_min-1.1.4c.jar等

    Java用xStream拼接xml

    webService接口对接时,需要传递一个xml内容。用xStream拼接xml

    xstream-1.4.7-API文档-中文版.zip

    赠送jar包:xstream-1.4.7.jar; 赠送原API文档:xstream-1.4.7-javadoc.jar; 赠送源代码:xstream-1.4.7-sources.jar; 赠送Maven依赖信息文件:xstream-1.4.7.pom; 包含翻译后的API文档:xstream-1.4.7-javadoc-...

    xstream-1.3.1-sae-liufeng

    修改XStream源码,解决SAE不支持XStream的问题。

Global site tag (gtag.js) - Google Analytics