xStream达成Java类输出xml文件
发布时间:2021-11-18 16:04:10 所属栏目:教程 来源:互联网
导读:很多情况下,需要生成结构明确的xml文件,来进行接口交互。 生成xml文件有很多工具,Java自己也可以一个节点一个节点的来生成,但效率低下,不方便结构化,也不通用。 可以根据java类来自动生成对应结构化的xml文件的库很多,今天简单说一下xStream库,非常
很多情况下,需要生成结构明确的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类: 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,可以设置类的输出别名,从而去掉包名的影响。 (编辑:东莞站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |