Storing a <String> List Using XStream with Specific Names

I want to save some class in xml:

XStream xstream = new XStream(new DomDriver()); List<String> modules = new ArrayList<String>(); modules.add("mod1"); modules.add("mod2"); ModulesConfig modulesConfig = new ModulesConfig(modules); xstream.processAnnotations(ModulesConfig.class); log.info(xstream.toXML(modulesConfig)); 

Config class modules:

 @XStreamAlias("modules-config") public class ModulesConfig { @XStreamAlias("moduleName") private List<String> moduleNames; public ModulesConfig(List<String> moduleNames) { this.moduleNames = moduleNames; } public List<String> getModuleNames() { return moduleNames; } public void setModuleNames(List<String> moduleNames) { this.moduleNames = moduleNames; } } 

Result:

 <modules-config> <moduleName> <string>mod1</string> <string>mod2</string> </moduleName> </modules-config> 

But I want the elements to be named "moduleName". How to configure xstream or what annotations should I add to the class? I want this result:

 <modules-config> <moduleNames> <moduleName>mod1</moduleName> <moduleName>mod2</moduleName> </moduleNames> </modules-config> 
+8
java xstream
source share
3 answers

This will not have an exact result for your query, but seems cleaner:

 @XStreamImplicit(itemFieldName="moduleName") private List<String> moduleNames; 

The result will be:

 <modules-config> <moduleName>mod1</moduleName> <moduleName>mod2</moduleName> </modules-config> 
+4
source share

You can define moduleNames as a Bean, Like this

 @XStreamAlias("moduleNames") public class ModuleNames{ @XStreamImplicit(itemFieldName="moduleName") private List<String> moduleNames; public List<String> getModuleNames() { return moduleNames; } public void setModuleNames(List<String> moduleNames) { this.moduleNames = moduleNames; } } //then add the ModuleNames as The List<String> and hide the List Tag @XStreamAlias("modules-config") public class ModulesConfig { @XStreamAlias("moduleNames") private ModuleNames moduleNames; public ModulesConfig(List<String> moduleNames) { this.moduleNames = moduleNames; } public List<String> getModuleNames() { return moduleNames.getModuleNames(); } public void setModuleNames(List<String> moduleNames) { this.moduleNames.set(moduleNames); } } 
+1
source share

I donโ€™t know the XSteam framework, but I think it will be very similar to JAXB. There you can do something like this.

ModuleConfig Class

 @XmlRootElement(name="moduleConfig") @XmlAccessorType(XmlAccessType.FIELD) public class ModuleConfig { List<ModuleName> moduleNames; public ModuleConfig() { moduleNames = new ArrayList<ModuleName>(); moduleNames.add(new ModuleName("mod1")); moduleNames.add(new ModuleName("mod2")); } } 

Class ModuleName

 @XmlRootElement(name="moduleName") @XmlAccessorType(XmlAccessType.FIELD) public class ModuleName { private String moduleName; public ModuleName() { } public ModuleName(String moduleName) { this.moduleName = moduleName; } public String getModuleName() { return moduleName; } } 

which will generate output like this

 <moduleConfig> <moduleNames> <moduleName>mod1</moduleName> </moduleNames> <moduleNames> <moduleName>mod2</moduleName> </moduleNames> </moduleConfig> 
0
source share

All Articles