未加星标

xStream实现Java类输出xml文件

字体大小 | |
[系统(linux) 所属分类 系统(linux) | 发布者 店小二04 | 时间 20160901 | 作者 红领巾 ] 0人收藏点击收藏
很多情况下,需要生成结构明确的xml文件,来进行接口交互。
生成xml文件有很多工具,java自己也可以一个节点一个节点的来生成,但效率低下,不方便结构化,也不通用。
可以根据java类来自动生成对应结构化的xml文件的库很多,今天简单说一下xStream库,非常简单,但实用。
如果只是根据java类生成xml文件,只需要xStream.jar以及所以来到xmlpull.jar,我用的是1.4.9版本的库,对应的文件是:xstream-1.4.9.jar以及xmlpull-1.1.3.1.jar。只需要在工程中包含这俩个jar文件即可。
假设要生成的xml结构如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<ADI>
<Asset>
<Metadata>
<AMS Provider="Rojao_IAS" Asset_ID="ADVV2001081701004000" Asset_Class="title" Verb="CREATE" />
<App_Data App="MOD" Name="Type" Value="title"/>
<App_Data App="MOD" Name="Year" Value="2016"/>
</Metadata>
<Asset>
<Metadata>
<AMS Provider="Rojao_IAS" Asset_ID="ADVV2001081701004000" Asset_Class="movie" Verb="CREATE" />
<App_Data App="MOD" Name="Encryption" Value="N"/>
<App_Data App="MOD" Name="Type" Value="movie"/>
<App_Data App="MOD" Name="Status" Value="0"/>
</Metadata>
<Content Value="ADVV2001081701004000.mpg"/>
</Asset>
</Asset>
</ADI>

那我们可以定义如下的java类:

xStream实现Java类输出xml文件
ADI.java:
public class ADI {
private Asset Asset;
public ADI() {
super();
}
public Asset getAsset() {
return Asset;
}
public void setAsset(Asset asset) {
this.Asset = asset;
}
}
Asset.java:
public class Asset {
private Metadata Metadata;
private Asset Asset;
private Content Content;
public Asset() {
super();
}
public Metadata getMetadata() {
return Metadata;
}
public void setMetadata(Metadata metadata) {
this.Metadata = metadata;
}
public Asset getAsset() {
return Asset;
}
public void setAsset(Asset asset) {
this.Asset = asset;
}
public Content getContent() {
return Content;
}
public void setContent(Content content) {
this.Content = content;
}
}
Metadata.java:
public class Metadata {
private AMS AMS;
private List<AppData> appDatas;
public Metadata() {
super();
this.appDatas = new ArrayList<AppData>();
}
public AMS getAms() {
return AMS;
}
public void setAms(AMS ams) {
this.AMS = ams;
}
public List<AppData> getAppDatas() {
return appDatas;
}
public void setAppDatas(List<AppData> appDatas) {
this.appDatas = appDatas;
}
}
Content.java:
public class Content {
private String Value;
public Content(String value) {
super();
Value = value;
}
public String getValue() {
return Value;
}
public void setValue(String value) {
Value = value;
}
}
AMS.java:
public class AMS {
private String Provider = "Rojao_IAS";
//资产ID
@XStreamAlias("Asset_ID")
private String assetID;
//title|movie
@XStreamAlias("Asset_Class")
private String assetClass;
//CREATE|DELETE
private String Verb;
public AMS(String asset_ID, String asset_Class, String verb) {
super();
assetID = asset_ID;
assetClass = asset_Class;
Verb = verb;
}
public String getProvider() {
return Provider;
}
public void setProvider(String provider) {
Provider = provider;
}
public String getAssetID() {
return assetID;
}
public void setAssetID(String asset_ID) {
assetID = asset_ID;
}
public String getAssetClass() {
return assetClass;
}
public void setAssetClass(String asset_Class) {
assetClass = asset_Class;
}
public String getVerb() {
return Verb;
}
public void setVerb(String verb) {
Verb = verb;
}
}
AppData.java:
public class AppData {
private String App = "MOD";
private String Name;
private String Value;
private String Language;
public AppData(String name, String value) {
super();
Name = name;
Value = value;
}
public String getApp() {
return App;
}
public void setApp(String app) {
App = app;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getValue() {
return Value;
}
public void setValue(String value) {
Value = value;
}
public String getLanguage() {
return Language;
}
public void setLanguage(String language) {
Language = language;
}
}
从上面的类的结构可以看出,通过类的包含关系,分别对应到xml格式的对应元素上。
通过注解,可以设置属性字段的名称,如@XStreamAlias
ADI adi = new ADI();
........设置ADI类以及子类的所有属性
XStream xstream = new XStream(new XppDriver(new NoNameCoder()));
使用NoNameCoder,是为了避免带下划线的字段,在生成xml时被自动替换为双下划线的问题。
try {
PrintWriter writer = new PrintWriter("f:/ADVV2001081701004000.xml","utf-8");
//自己写xml头部
writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
//设置Xstream解析注解
xstream.autodetectAnnotations(true);
//String类型字段解析为xml属性而为子节点
xstream.useAttributeFor(String.class);
//设置类的别名
xstream.alias("ADI", ADI.class);
xstream.alias("App_Data", AppData.class);
//忽略集合名称,也就是生成的xml中不包含集合名称的节点,而是把集合元素输出
xstream.addImplicitCollection(Metadata.class, "appDatas");
xstream.toXML(adi, writer);
} catch (Exception e) {
e.printStackTrace();
}

通过上面的注释,可以很容易理解。如果类有package,通过alias,可以设置类的输出别名,从而去掉包名的影响。

本文地址:http://www.linuxidc.com/Linux/2016-09/135653.htm


xStream实现Java类输出xml文件

本文系统(linux)相关术语:linux系统 鸟哥的linux私房菜 linux命令大全 linux操作系统

主题: JavaXMLLinuxUT
分页:12
转载请注明
本文标题:xStream实现Java类输出xml文件
本站链接:http://www.codesec.net/view/483445.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 系统(linux) | 评论(0) | 阅读(25)